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中使用。

最后修改:2023 年 02 月 01 日
如果觉得我的文章对你有用,请随意赞赏