callee
- 描述
callee是指向arguments对应的函数即callee.arguments指向arguments对应的函数 - 应用
可以在函数递归的时候解耦名称不一样的限制 代码
//使用前 function factorial(num) { if (num <= 1) { return 1; } else { return num * factorial(num - 1); } } //使用后 function factorial(num) { if (num <= 1) { return 1; } else { return num * arguments.callee(num - 1); } } //调用 let trueFactorial = factorial; factorial = function() { return 0; }; console.log(trueFactorial(5)); // 120 console.log(factorial(5)); // 0
caller
- 描述
这个属性是用来引用调用当前函数的函数 - 使用
function outer() {
inner();
}
function inner() {
console.log(inner.caller);
}
outer();
call
- 描述
call的作用是改变被调用函数的函数体内的this值,第一个参数是this值,剩下的参数是传入的额外值 call方法的额外参数
function sum(num1, num2) { return num1 + num2; } function callSum(num1, num2) { return sum.call(this, num1, num2); } console.log(callSum(10, 10)); // 20
- call方法改变额外调用函数的this指向
let o = {
color: 'blue'
};
function sayColor() {
console.log(this.color);
}
sayColor(); // red sayColor.call(this); // red sayColor.call(window); // red sayColor.call(o); // blue
call通过改变sayColor函数的内部this指向使其指向o
apply
- 描述
apply的作用与call类似,第一个参数是要改变函数内部的this值,只不过第二个参数可以是arguments或者数组,用来收集传入的参数。 - call的额外参数的传入
function sum(num1, num2) {
return num1 + num2;
}
function callSum1(num1, num2) {
return sum.apply(this, arguments); // 传入arguments对象}
function callSum2(num1, num2) {
return sum.apply(this, [num1, num2]); // 传入数组} console.log(callSum1(10, 10)); // 20 console.log(callSum2(10, 10)); // 20
- call方法改变函数内部的this指向
bind
- 描述
在es5中改变函数内部this指向提供的一个方法 - 使用
window.color = 'red';
var o = {
color: 'blue'
};
function sayColor() {
console.log(this.color);
}
let objectSayColor = sayColor.bind(o);
objectSayColor(); // blue
总结
callee是替代arguments对应的函数,caller属性是用来引用调用当前函数的函数。这两个都是属性。而call、apply、bind都是方法主要作用是改变this指向,其中call和apply是es6中使用的方法,可接受传入额外参数。bind方法是es5中使用。