5.5 Function类型

函数实质上是对象, 每个函数都是Function类型的实例, 并且都和其他引用类型一样具有属性和方法.

因此函数名实际上也是一个指向函数对象的指针, 不会与某个函数绑定.

三种函数定义方法:

  1. 函数声明:

function sum(num1, num2){
return num1 + num2;
}

  2. 函数表达式:

var sum = function(num1, num2){
return num1 + num2;
};

  3. 使用Function构造函数

var sum = new Function("num1", "num2", "return num1 + num2");   //不推荐

  

5.5.1 没有重载

5.5.2 函数声明与函数表达式

解析器会率先读取函数声明. 并使其在执行任何代码之前可用; 但对函数表达式, 则必须等到解析器执行到它所在的代码行,才会真正解释执行.

5.5.3 作为值的函数

5.5.4 函数内部属性

1) arguments

  • 属性callee: 一个指针,指向拥有这个arguments对象的函数. 其实就是指向当前函数呗
  • //举个例子: 一个阶乘函数
    function factorial(num){
    if(num <= 1 ){
    return 1;
    } else {
    return num * factorial(num-1);
    }
    }
    //这个函数的执行与函数名紧耦合, 为了消除这种紧耦合,使用arguments.callee
    function factorial(num){
    if(num <= 1){
    return 1;
    } else {
    return num * arguments.callee(num-1);
    }
    }
    //这个重写后的factorial()函数的函数体内,没有再引用函数名. 这样,无论引用函数时使用什么名字,都可保证正常完成递归调用.
  • 对象this: 引用的是函数据以执行的环境对象-----当在网页的全局作用域中调用函数时,this对象引用的就是window

  • ECMAScript 5 规范化了另一个函数对象的属性: caller. 这个属性中保存着调用当前函数的函数的引用, 如果是全局作用域中调用当前函数,它的值为null
    • function outer(){
      inner();
      }
      function inner(){
      alert(arguments.callee.caller); //arguments.callee == inner
      }
      outer(); //会显示outer()函数的源代码

严格模式下:

  访问arguments.callee会导致错误.

  ECMAScript 5 还定义了arguments.caller属性, 但在严格模式下访问它也会导致错误, 而在非严格模式下这个属性始终是undefined. 定义这个属性是为了分清arguments.caller和函数的caller属性

  不能为函数的caller属性赋值, 否则会导致错误

5.5.5 函数属性和方法

  • 每个函数都包含两个属性: length 和 prototype.

    • 其中, length属性表示函数希望接收的命名参数的个数
  • 每个函数都包含两个非继承而来的方法: apply 和 call
    • 两个方法都是用于在特定的作用域中调用函数,实际上等于设置函数体内this对象的值.
    • apply方法接收两个参数,一个是在其中运行函数的作用域, 另一个是参数数组. 参数数组可以是Array的实例, 也可以是arguments对象
    • 对call方法而言, 第一个参数是this值没变,第二个参数是其余参数都直接传递给函数. 即传递给函数的参数必须逐个列举出来
    • 使用call和apply方法来扩充作用域
      • 好处: 对象不需要与方法有任何耦合关系
  • ECMAScript 5 还定义了一个方法: bind(). 这个方法会创建一个函数的实例, 其this值会被绑定到传给bind()函数的值.
    • window.color = "red";
      var o = { color: "blue"}; function sayColor(){
      alert(this.color);
      }
      var objectSayColor = sayColor.bind(o);
      objectSayColor(); //blue
  • 每个函数继承的toLocaleString()和toString()方法始终都返回函数的代码.
  • 另一个继承的valueOf()方法也同样只返回函数代码

《JavaScript高级程序设计》5.5 Function类型的更多相关文章

  1. 引用类型-Function类型

    Function类型 定义函数的三种方式: 1.函数声明 function sum(num1,num2){ return num1 +num2; } 2.函数表达式 var sum = functio ...

  2. 【笔记】js Function类型 内部方法callee

    运用function实现阶乘 以往的做法是如下的 function factorial(num){ if(num <= 1){ return 1; }else{ return num * fac ...

  3. Function类型

    1.每个函数都是Function类型的,和其他引用类型一样都具有属性和方法.函数也是对象,因此函数实际上是一个指向函数对象的指针. 函数声明语法定义: 方法1: function sum(num1,n ...

  4. JavaScript笔记——引用类型之Object类型和Function类型

    <JavaScript高级程序设计>中介绍的几种JavaScript的引用类型,本文只记了Object跟Function类型 Object类型 创建对象 var person = new ...

  5. String类型,Function类型

    1.String类型:  1)创建String对象:    var str=new String(s);    String(s);    参数:参数 s 是要存储在 String 对象中的值或转换成 ...

  6. JavaScript高级 Function类型

    ·    Function类型 (属于引用类型) 1.JS中,有的函数均是对象,这个一个非常有特点的地方.它既然是对象,那么它的构造函数是谁呢?就是Function.(例如:function Pers ...

  7. 浅析JavaScript之Function类型

    JavaScript中的函数实际上是对象,每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上只是指向函数对象的指针,保存函数在堆内存中的地 ...

  8. 笔记——Function类型 及其 call、apply方法

    每个函数都是Function类型的实例.函数有三种定义方式和两个内部属性arguments和this. 同时函数也是对象,也有属性和方法.本篇主要其call()和apply()方法 属性 length ...

  9. 引用类型之Function类型

    Function类型 ECMAScript中最有意思的就是函数了,有意思的根源,在于函数实际上是对象.每个函数都是Function的实例,具有属性和方法.而重要的一点是,函数名,不过是指向函数的指针, ...

  10. 第十一章 Function类型

    在ECMAScript中,Function(函数)类型实际上是对象.每个函数也是Function类型的实例,而且都与其它引用类型一样具有属性和方法.由于是函数对象,因此函数名实际上也是一个指向函数对象 ...

随机推荐

  1. dede自定义标签

    在dede安装目录下的include/taglib下创建标签文件,比如mytest.lib.php.(必须以.lib.php为后缀) <?php if(!defined('DEDEINC')) ...

  2. 将Boost库添加到Visual Studio 2017

    在windows 环境中,一般比较推荐的打包软件的方式是,将自己所需要的共享库放在软件自己的文件夹中,并且避免与其它的软件共用.除非是微软的官方组件,比如微软自家的VC Runtime. Boost库 ...

  3. db2 sql调优

    当我们发现某个SQL语句执行很慢时,可以通过查看它的访问计划来定位原因,如是否执行了合适的索引.是否采用了正确的连接方法等.但是我们发现很多用户对访问计划的生成和解释工具的使用存在很多疑惑,本文通过一 ...

  4. [PHP]require include

  5. OpenSource.iOS.ProtobufWithObjective-C

    2. 在iOS(Mac OS X)中使用protobuf 2.0 构建protoc A) 下载最新的protobuf版本 B) 依据README中的步骤依次进行 2.1 添加protobuf到工程中 ...

  6. KMP(2)

    KMP 算法(2):其细微之处 2017 年 05 月 13 日 • 技术 系列文章目录 KMP 算法(1):如何理解 KMP KMP 算法(2):其细微之处 本篇来谈一谈 KMP 的一些细微之处,直 ...

  7. 201621123008 《Java程序设计》第五周学习总结

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键词:接口,内部类. 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不需要出现过多的字. 1.3 可选:使用常 ...

  8. [BAT]通过schtasks.exe远程调用windows 2008 server上的计划任务,提示ERROR : Access is denied

    在windows 2008 server 上建了一个计划任务,想通过命令 schtasks /run /tn "IPADForAdvisor_QA_APITest" /s SZPC ...

  9. Maven系列(一)plugin

    Maven系列(一)plugin maven-compiler-plugin 使用 mvn compile 命令,出现错误: 编码 GBK 的不可映射字符而不能编译.这是因为代码或注释中存在中文引起的 ...

  10. Product of integers

    https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...