2011-12-22 65 views
3

编辑:这个问题是由于我的误解而被问到的。谨慎行事,因为阅读可能会浪费你的时间。仅在第一个参数上调用Javascript调用和应用函数?

我以为callapply会执行一个给定一组参数的函数,但我得到了令人困惑的测试结果。看我的测试代码:

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个。
我在这里做错了什么?

(在Chrome和Firefox测试使用Firebug。)

回答

6

两个callapply只调用函数一次。区别在于如何传递调用的参数。

通过调用,上下文之后的每个参数(第一个参数)都是一个参数。通过apply,第二个参数应该是这样的数组,如参数对象(第一个参数仍然提供上下文)。

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; 

如果您想要多次调用该函数,只需将该调用放在一个循环中即可完成此操作。

3

这是预期的,您传递的参数将出现在您的增量函数中(如arguments请参见here for reference),但您只调用该函数一次。

2

看来你的印象是callapply方法应该为每个参数调用functon一次。情况并非如此,它只调用一次函数。

apply方法采用参数数组:

func.apply(this, [1, 2, 3]); 

call方法需要一个参数列表:

func.call(this, 1, 2, 3);