【发布时间】:2011-09-18 05:57:56
【问题描述】:
我在浏览JavaScript Garden 时偶然发现了用于创建“快速、未绑定的包装器”的 Function.call.apply hack。它说:
另一个技巧是同时使用 call 和 apply 来创建快速、未绑定的包装器。
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.apply 足够时,为什么还要麻烦使用 Function.call.apply 。毕竟两者在语义上是等价的。
【问题讨论】:
-
我确实发布了指向JavaScript Garden 的链接。如果您想直接跳转到包含帖子的部分,请点击here。
-
tnx,- 似乎他们暗示这个 hack 可以加快速度。但是,真的,只是不要使用它。
-
@Aadit
Function.call.apply和Function.apply在这里不能相同,因为前者应用Function.call而第二个尝试应用Function构造函数。我的答案中有详细信息,但我敢打赌,如果 Ivo Wetzel 来回答这个问题,他会更加雄辩和易于理解。这是相当深刻的东西。我同意这可能不是你应该使用的东西,除非你想让同事花费,哦我不知道,一个 半小时 试图理解它。 :) -
我认为
Function.call实际上有点误导。它真的应该是Function.prototype.call,因为Function.call可能会被覆盖。Function毕竟只是一个函数对象。 (是的,这很难理解) -
@Pubbaa80 虽然
Function.call===Function.prototype.call没有讨厌的东西,但我完全同意你的看法。但请注意JSON.stringify(Object.getOwnPropertyDescriptor(Function.prototype, "call"))返回{"writable":true,"enumerable":false,"configurable":true},所以真正邪恶的也可以覆盖Function.prototype.call。哎呀。
标签: javascript