Function.prototype.apply不适用于Chrome中的Function.prototype.call

时间:2015-06-22 14:44:48

标签: javascript

标题应该是自我解释的,我想知道是否有解决方法。

Window.call.apply;
>> function apply()

Window.call.apply();

>> Uncaught TypeError: Window.call.apply is not a function
    at <anonymous>:2:13
    at Object.InjectedScript._evaluateOn (<anonymous>:895:140)
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
    at Object.InjectedScript.evaluate (<anonymous>:694:21)

基本上,我很惊讶apply适用于除了一个以外的所有功能。

我正在编写一些需要调用本机javascript函数的更高级别的VM(遗憾的是,Function.prototype.call就是其中之一),所以我需要函数apply才能传递我的上下文和参数数组。

更新 看来这只是一些奇怪的错误信息。 当我希望能够调用具有可变数量的参数的构造函数并显式传递this时,我发现了这一点,这是一个对象而不是预期的函数。

也许下面是一个更现实的例子:

function Fruit(name) {
  this.name = name;
}
var x = {};
Fruit.call(x, "Apple");
// I thought this would also work, but it throws above error message
(Fruit.call).apply(x, ["Apple"]);
// Should instead use the constructor directly
Fruit.apply(x, ["Apple"]);
// or
(Fruit.call).apply(someFunction, [x, "Apple"]);

1 个答案:

答案 0 :(得分:2)

您收到错误是因为您没有将参数传递给.apply。 Firefox抛出了更合理的错误:

  

TypeError:在不兼容的未定义

上调用Function.prototype.call

如果您实际传递了应该调用的函数,它在两种浏览器中都可以正常工作:

Window.call.apply(function foo() { console.log('foo'); });

注意:如果您确实希望将Window函数应用于任意对象,则这可能不起作用。主机对象/功能通常更具限制性,尤其是涉及DOM时。