函数原型中的 call 和 apply 方法的区别

Yujiaao 2019-08-23 18:00:06
原文地址:https://segmentfault.com/a/1190000020133714

call, apply都属于Function.prototype的方法

它们是在 JavaScript 引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性。它们的作用一样,只是使用方式不同。

call 与 apply 调用参数不同

不同之处在于调用apply函数时,参数可以使用数组; call要求明确列出参数。

助记法: Apply 的A表示 Array, 即数组, 而 Call 的 C 表示 Comma, 即逗号。

更多请参阅MDN的文档。

伪语法:

theFunction.apply(valueForThis, arrayOfArgs)
theFunction.call(valueForThis, arg1, arg2, ...)

从ES6开始,还有展开spread数组与该call功能一起使用的可能性,你可以在这里看到兼容性。

示例代码:

function theFunction(name, profession) {
    console.log("My name is " + name + " and I am a " + profession +".");
}
theFunction("John", "fireman");
theFunction.apply(undefined, ["Susan", "school teacher"]);
theFunction.call(undefined, "Claude", "mathematician");
theFunction.call(undefined, ...["Matthew", "physicist"]); // 使用展开语法

搞这么复杂,直接调用函数不好吗?

主要是为了模拟面向对象,对状态进行封装的同时, 不同实例可以有不同的内部状态,如:

var module = {
  x: 42,
  getX: function() {
    return this.x;
  }
}

var unboundGetX = module.getX;
console.log(unboundGetX()); // 函数在全局范围内调用,this=window
// 会输出: undefined, 因为window下没有定义x
unboundGetX.call(module) //输出 42, 或使用 bind 也有同样的效果
var module1 ={
   x:123,
   getX: unboundGetX  //this 变为module1
}
module1.getX() //返回123

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。