函数的内置属性

注意 : arguments.caller , arguments.callee  这些在严格模式下会报错.
 
1.  callee 的使用
 
经典阶乘函数 :
  function factorial(num){
    if(num <= 1) return 1 ;
    else return num * factorial(num-1);
  }
 
上面代码进行递归的调用时候,与函数名称耦合度太高
导致在某种情况下调用时,就会得不到意料中的结果.
  var anotherFactorial = factorial ;
  factorial = function(){ return 0 ;}
  anotherFactorial(10); // display 0  
 
使用函数的内置属性 arguments , 以及 callee 进行解耦合:
  function factorial(num){
    if(num<=1) return 1 ;
    else return num * arguments.callee(num-1);
  }
 
这样 当函数名(即引用) 指向其他函数后 ,不会误执行变化后的函数 .结果就是正常结果了.
 
 
2. caller 的使用(配合callee)
 
function outer(){
  inner();
}
function inner(){
  // 这里使用了inner,耦合性高
  console.log(inner.caller);
 
  // 这里对上面输出进行 解耦. 输出的都一样:outer函数的源码.
  console.log(arguments.callee.caller);
}
outer();
 
 
length
  函数的length表示 它想要接收的参数,比如sum(a,b){} 的length为2.
 
call() 以及 apply()
 
function say(word1){
  return `${word1} , ${this.word} !` ;
}
 
var obj = {
    word1 : "hello",
    word : "world"
};
// 以下三种方式 均可以 在this指代的对象上进行调用 sum()函数.
say.call(obj, word1);// call 必须把所有参数用逗号分隔,罗列出来
say.apply(obj, arguments); // apply 接受的是数组来传递参数
say.apply(obj, [word1]);
 
bind()
 
    window.color = 'red';
    var o = {color:"orange"};
 
    function getColor(){
        return this.color;
    }
 
    var getObjColor = getColor.bind(o);
    getObjColor(); // display 'orange'
    getColor(); // display 'red' ;
 
posted @ 2019-07-04 13:20  豆豆飞  阅读(170)  评论(0编辑  收藏  举报