• 《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()方法也同样只返回函数代码
  • 相关阅读:
    国旗国徽图案标准版本
    Microsoft Office 2013 64位免费完整版(office2013)
    PS的简单抠图教程
    1.5td什么意思
    html img 去除图片之间的缝隙
    PS如何去除图片上的网址
    如何用Photoshop/PS画直线
    实达690KPro参数
    Redis实战篇(一)搭建Redis实例
    Redis性能篇(五)Redis缓冲区
  • 原文地址:https://www.cnblogs.com/haoyijing/p/5789339.html
Copyright © 2020-2023  润新知