注意 : 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' ;