6

我被这种奇怪的感觉难住了。

假设我有这个数组:

var array = [{
  something: 'special'
}, 'and', 'a', 'bunch', 'of', 'parameters'];

我可以使用函数applyapply方法来调用函数,其中的this对象是{something: 'special'}其余的,参数是其余的array吗?

换句话说,我可以这样做吗

var tester = function() {
  console.log('this,', this);
  console.log('args,', arguments);
};
tester.apply.apply(tester, array);

并期望输出如下?

> this, {"something": "special"}
> args, {"0": "and", "1": "a", "2": "bunch", "3": "of", "4": "parameters"}

我尝试过这个。

TypeError: Function.prototype.apply: Arguments list has wrong type

但为什么?看来这应该可行。

4

2 回答 2

11

但为什么?

让我们逐步减少您的通话:

tester.apply.apply(tester, array) // resolves to
(Function.prototype.apply).apply(tester, array) // does a
tester.apply({something: 'special'}, 'and', 'a', 'bunch', 'of', 'parameters');

在这里你可以看到出了什么问题。正确的是

var array = [
    {something: 'special'},
    ['and', 'a', 'bunch', 'of', 'parameters']
];

那么apply.apply(tester, array)就会变成

tester.apply({something: 'special'}, ['and', 'a', 'bunch', 'of', 'parameters']);

它做了一个

tester.call({something: 'special'}, 'and', 'a', 'bunch', 'of', 'parameters');

因此,对于您的原件array,您需要使用

(Function.prototype.call).apply(tester, array)
于 2013-07-16T20:49:11.673 回答
0

apply 方法采用一个参数作为this上下文,一个参数作为您要应用的参数。第二个参数必须是一个数组。

tester.apply.apply(tester, array);

由于第二个 apply 方法,第一个将被这样调用:

tester.apply({something: 'special'}, 'and', 'a', 'bunch', 'of', 'parameters');

而且由于“and”不是数组,因此您会得到您描述的 TypeError 。您可以使用以下call方法轻松解决此问题:

tester.call.apply(tester, array);

call将采用单个参数而不是数组,这将产生所需的结果。

于 2013-07-16T20:52:20.440 回答