Function 作为 JavaScript 的内置对象,拥有以下两个方法:
- Function.call();
- Function.apply();
这两个方法所实现的功能都是相同的:将函数作为对想象的方法调用。(引用自《JavaScript 权威指南》P.768 Function.call())。这两者的不同之处在于参数的类型不一样。
具体二者不同之处不是本文的重点,读者若想了解可以自行搜索。
言归正传,本文将通过实现类似 Function.call()的功能函数来深入解释其函数内部的运行机制!
Function.call()的需求分析
在研究该函数内部的运行机制之前,我们先来了解以下该函数具体是要实现什么样的功能?
根据《JavaScript 权威指南》P.768 有关 Function.call(thisobj, args...)的描述,其详细解释如下:
call()将指定的函数 function 作为对象 thisobj 的方法来调用,并传入参数列表中 thisobj 之后的参数。返回的是调用 function 的返回值。在函数体内,关键字 this 指代 thisobj 对象,如果 thisobj 位 null,则使用全局对象。
也就是说 call()函数将会用 thisobj 来调用指定的函数 function,并返回结果。
Function.prototype.myCall()方法设计
在有了上述描述之后,我们就可以着手设计方法了!我们先写一下伪代码:
Function.prototype.myCall = function(obj) {
let object = 如果有传入对象obj传入则保留obj,否则为全局对象
在object上添加一个临