直接函数调用和闭包中的call()apply()之间的区别是什么

时间:2012-11-01 04:52:35

标签: javascript function

我在权威指南中阅读了这个片段:

function not(f)
{
  return function()
  {
    var result=f.apply(this,arguments);
    return !result;
  }
}

我无法理解的是,由于此函数f位于闭包中,因此this已经this,为什么此代码段不会直接使用{{1} }}?

我甚至读了一些带有undefined / null的var result=f(arguments);作为第一个参数,我认为可以用直接调用完全取代:

call

为什么作者使用call()而不是直接调用?直接函数调用和... while(i>len) { if(i in a) accumulator=f.call(undefined,accumulator,a[i],i,a); i++; } ... 之间是否有任何区别,因为它是第一个参数?

1 个答案:

答案 0 :(得分:4)

var result=f(arguments);

...将调用f()传递一个参数arguments对象。

var result=f.apply(this,arguments);

...将f()分别调用arguments对象中的参数(可以这么说)。

所以让我们说f()被定义为:

function f(a,b,c) {
    // do something with a, b, c
    return c;
}

然后给出三个参数1,2,3arguments的直接调用是这样的:

f([1,2,3]);

(请注意arguments 类似数组; 它不是实际数组。)

.apply()版本是这样的:

f(1,2,3);