我在浏览JavaScript Garden时,偶然发现了用于创建“快速、未绑定包装器”的Function.call.apply hack。它说:
Another trick is to use both call and apply together to create fast, unbound wrappers.
function Foo() {} Foo.prototype.method = function(a, b, c) { console.log(this, a, b, c); }; // Create an unbound version of "method" // It takes the parameters: this, arg1, arg2...argN Foo.method = function() { // Result: Foo.prototype.method.call(this, arg1, arg2... argN) Function.call.apply(Foo.prototype.method, arguments); };
我不明白的是为什么要使用Function.call.apply,而Function.apply就足够了。毕竟,它们两个在语义上是等价的。
Function.call.apply
和Function.apply
在这里不能相同,因为前者应用了Function.call
,而后者尝试应用Function
构造函数。详情请参见我的答案,但我敢打赌,如果Ivo Wetzel来回答这个问题,他的回答会更优雅和易懂。这是相当深奥的东西。我同意,除非你想让同事花费半个小时来理解它,否则你可能不应该使用它。 :) - Ray ToalFunction.call
实际上有点误导。它应该是Function.prototype.call
,因为Function.call
可以被重写。毕竟,Function
只是一个函数对象。(是的,这很难理解) - user123444555621Function.call === Function.prototype.call
,我完全同意你的看法。但是请注意,JSON.stringify(Object.getOwnPropertyDescriptor(Function.prototype, "call"))
返回{"writable":true,"enumerable":false,"configurable":true}
因此真正邪恶的人也可以覆盖Function.prototype.call
。哎呀。 - Ray Toal