【发布时间】:2021-12-03 00:02:22
【问题描述】:
众所周知Function.prototype.call.call(func)与Function.call.call(func)相同,与func()相同
这种技术从第一个浏览器开始就一直有效。因此“双重调用”的算法可以很容易地从ES5 specification推导出来
Function.prototype.call (thisArg [ , arg1 [ , arg2, ... ] ] )
当对象 func 调用 call 方法时,使用参数 thisArg 和可选参数 arg1, arg2 等,采取以下步骤:
- 如果 IsCallable(func) 为 false,则抛出 TypeError 异常。
- 让 argList 为空 List。
- 如果使用多个参数调用此方法,则以从左到右的顺序从 arg1 开始将每个参数附加为 argList 的最后一个元素
- 返回调用func的[[Call]]内部方法的结果,提供thisArg作为this em> 值和 argList 作为参数列表。
考虑一个简单的例子:
var func = function(){ console.log(42) };
Function.prototype.call.call(func);
所以.call.call(func) 是Function.prototype.call 的内部方法[[Call]] 的调用,提供func 作为this 值。这怎么会导致func的调用?
看起来.call 的[[Call]] 内部方法实际上调用了它的this 值(如func.call() 的情况)。但我没有从规范中得到它。
【问题讨论】:
-
如果你对 ES5 规范没有过分痴迷,也许contemporary spec 在这种情况下会更直接。
标签: javascript ecmascript-6 ecmascript-5