《JavaScript高级程序设计》5.5 Function类型

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()方法也同样只返回函数代码

posted on 2016-08-19 23:02  杠子  阅读(235)  评论(0编辑  收藏  举报

导航