3

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

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

我无法理解的是,既然这个函数f在闭包中,它this已经是了this,为什么这个片段不直接使用var result=f(arguments);呢?

我什至读了一些call以 undefined/null 作为第一个参数的 s,我认为可以完全用直接调用代替:

...
while(i>len)
{
  if(i in a)
     accumulator=f.call(undefined,accumulator,a[i],i,a);
  i++;
}
...

为什么作者使用 call() 而不是直接调用?call()直接函数调用和未定义作为它的第一个参数之间有什么区别吗?

4

1 回答 1

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,3,直接调用arguments是这样的:

f([1,2,3]);

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

.apply()版本是这样的:

f(1,2,3);
于 2012-11-01T05:00:59.293 回答