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
  • 相关阅读:
    tcp/ip协议listen函数中backlog參数的含义
    oracle exp实例
    js21---单体(单例)模式
    js20---接口3种方式
    js19--继承终极版本
    js18--继承方式
    js17---创建对象:构造函数式和原型组合模式、动态原型模式、稳妥构造函数式
    js16--自定义原型对象
    js---15,模拟数组的ecah方法
    js14--原型2
  • 原文地址:https://www.cnblogs.com/gaoyangdev/p/12974117.html
Copyright © 2011-2022 走看看