编辑:由于我的误解,这个问题被问到了。请谨慎行事,因为阅读它可能会浪费你的时间。
我认为call
和apply
会在给定一组参数的情况下执行函数,但是我的测试结果令人困惑。看我的测试代码:
window.z = 0;
(function(){++(window.z)}).call(this, 1, 2, 3)
我希望z
在执行后为3。但是,z是1。
(function(){++(window.z)}).apply(this, [1, 2, 3])
同样在这里。 z == 1;
我也试过简单地记录输入参数:
var x = function(y){console.log(y);}
x.call(this, 1, 2, 3);
结果?只记录1个 我在这里做错了什么?
(使用Firebug在Chrome和Firefox中测试过。)
答案 0 :(得分:6)
call
和apply
都只调用一次该函数。不同之处在于如何传递调用的参数。
通过调用,上下文(第一个参数)之后的每个参数都是一个参数。使用apply时,第二个参数应该是一个数组 like 参数对象(第一个参数仍然提供上下文)。
function foo(a, b, c) {
};
foo.call(this, 1, 2, 3); // a == 1, b == 2, c == 3;
foo.apply(this, [1,2,3]); // a == 1, b == 2, c == 3;
如果您想多次调用该函数,只需将调用置于循环中即可完成此操作。
答案 1 :(得分:3)
这是预期的,您传递的参数将出现在您的增量函数中(如arguments
请参阅here for reference),但您只调用该函数一次。
答案 2 :(得分:2)
您似乎认为call
和apply
方法应为每个参数调用一次功能。情况并非如此,它只调用一次函数。
apply
方法接受一组参数:
func.apply(this, [1, 2, 3]);
call
方法采用参数列表:
func.call(this, 1, 2, 3);