zoukankan      html  css  js  c++  java
  • 关于argument、this、argument的callee属性、apply()方法和call()方法

      在函数的内部,有两个特殊的对象:arguments和this。arguments是一个类数组对象,它包含所有传入这个函数的所有参数;它有一个属性callee,callee是一个指针,指向拥有这个arguments对象的函数。

      以下是非常经典的乘阶函数代码:

        function factorial(num) {

          if (num <= 1) {

            return 1;

          }else{
            return num * factorial(num - 1);//此段代码亦可写成arguments.callee(num - 1);
          }

        }

      this引用的是函数据以执行的环境对象——或者可以说是this的值。

      ES5中定义了函数的另一个对象属性: caller。这个函数保存着调用当前函数的函数引用,如果在全局环境中调用当前函数,它的值为null,例:

        function outer() {
          inner();
        }

        function inner() {
          alert(arguments.callee.caller);
        }

        outer();

      这段代码会弹出outer();的源码。注意:在严格模式下方为arguments.callee会导致错误。
      

      每个函数都有length和prototype属性,其中length表示函数希望接收的命名参数的个数,来个栗子:

      function sayName(name) {
        alert(name);
      }

      alert(sayName.length); //1

      每个方法都有两个非集成而来的方法:apply()和call().
      apply()接收两个参数:一个是函数的作用域,第二个是参数数组,第二个参数可以是数组实例,也可以是arguments对象。apply()和call()的作用相同,他们的区别在于接收参数的方式不同。call的第一个参数值是this没有变化,变化的是call其余参数都是直接传递给函数,也就是其余参数都必须一一列举出来。例子:

        function sum (num1 + num2) {

          return num1 + num2;

        }

        function callNum(num1,num2) {
          return sum.call(this,num1,num2);
        }

        alert(callSum(callSum(10,10))); //20 在使用call()时,callSum()必须明确传递参数。

        call()和apply()真正强大的作用在于,他们能够扩展函数赖以运行的作用域。

        例子:

            window.color = 'red';

           var o = {color: 'blue'};

           function sayColor() {

             console.log(this.color);

           }

           sayColor();//red

           sayColor.apply(this);//red

           sayColor.call(window);//red

           sayColor.call(o);//blue

            

      

      

  • 相关阅读:
    私有云是伪命题:真正的私有云 ≈ 公有云
    云计算的重新构建架构:优化迁移策略
    五个顶级的大数据架构
    Algorithm Gossip: 费式数列
    Algorithm Gossip: 河内塔
    Mysql连接报错:Unknown system variable 'language'
    ssm整合的时候出现的abstactMethodArror 解决
    java集合整理
    Oracle的序列和索引
    关于java堆栈的理解与说明
  • 原文地址:https://www.cnblogs.com/zhangbob/p/6836461.html
Copyright © 2011-2022 走看看