我被这种怪异所困扰.
假设我有这个数组:
var array = [{ something: 'special' },'and','a','bunch','of','parameters'];
我可以应用函数的apply方法来调用函数,该对象是{something:’special’},参数是数组的其余部分吗?
换句话说,我可以这样做吗?
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
但为什么?看起来这应该有效.
解决方法
But why?
让我们一步一步减少你的电话:
tester.apply.apply(tester,array) // resolves to (Function.prototype.apply).apply(tester,array) // does a tester.apply({something: 'special'},'parameters');
在这里你可以看到出了什么问题.正确的是
var array = [ {something: 'special'},['and','parameters'] ];
那么apply.apply(tester,array)就会变成
tester.apply({something: 'special'},'parameters']);
哪个做了
tester.call({something: 'special'},'parameters');
因此,您需要使用原始阵列
(Function.prototype.call).apply(tester,array)