JavaScript中函数记要(二)

在函数内部有着一个名叫arguments的类数组对象,内部包含着传入函数的一切参数,在arguments对象中,有一个名叫callee的属性,其作用可见下面这个阶乘的栗子:

function factorial(num){
  if(num<=1){
    return 1;
  }else{
    return num*factorial(num-1);
    //这里也能够写成以下体式格局
    return num*arguments.callee(num-1);
  }
}
console.log(factorial(5))//120

能够看到的是,arguments.callee这个属性作为一个指针指向了具有arguments对象的函数,也能够认为是当前正在实行的函数,而且能够消弭与函数名factorial的耦合,不过值得注意的是,在ES5的严厉形式下,挪用arguments.callee要领会报错。

函数内部另有一个对象,就是我们所熟习的this对象,this对象援用的是函数实行的环境对象,简朴来讲,this老是指向函数的直接挪用者,而非间接挪用者,在对象中,如果有new关键字,this指向new出来的谁人对象。

在函数对象中,有个属性名为caller,这个属性作为一个援用,保存着挪用当前函数的其他函数的援用,以下

(function(){
  bar();//function (){bar();}
})();
function bar(){
  console.log(bar.caller)//arguments.callee.caller
}

能够看到的是,匿名函数内部挪用了bar函数,在bar函数内部,由于 bar.calller指向了挪用bar的匿名函数,所以实行bar.caller就即是匿名函数的源代码,同callee一样的是,在ES5中接见caller属性会报错。

函数内部除了以上轻易殽杂的属性之外,另有些要领有时候也会让人比较疑心,比方call跟apply,show the code

function add(a,b){
  return a+b;
}
function foo(a,b){
  console.log(add.call(this,a,b))
}
function bar(a,b){
  console.log(add.apply(this,[a,b]))
}
foo(20,20)//40
bar(20,20)//40

能够看到的是,call和apply两个要领作用都是在特定的作用域上面挪用函数,换句话说,就是转变函数体内this指向,在foo和bar函数中,我们应用call和apply将函数的this值绑定到add函数上,因而它们便能够对内部的参数实行add函数内里的加法操纵。

call和apply要领大作用致雷同,差别的要领接收的参数,call必需要明白一切要处置惩罚的参数,也就是说,参数必需要逐一枚举,而apply要领能够挑选数组作为参数,因而能够在详细的环境中,看看是挑选call照样apply要领。

    原文作者:三井寿
    原文地址: https://segmentfault.com/a/1190000010320031
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞