2012-11-01 85 views
3

我看了這個片段的權威指南中的不同應用(:有什麼直接的函數調用,調用(間))在封閉

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

我無法理解的是,因爲該功能f在關閉,它的this已經是this,爲什麼不直接使用這個片段var result=f(arguments);

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

爲什麼筆者使用()調用而不是直接調用:

我甚至未定義/ null作爲,我認爲完全可以用直接調用替換第一個參數讀一些call S'直接函數調用和call()之間有沒有區別,因爲它是第一個參數?

回答

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); 
+0

@nnnnnn謝謝!非常清楚的解釋!但是第二個片段中的'call()'具有undefined作爲第一個參數呢? – LotusH

+2

在這種情況下,如果代碼不是嚴格模式,'undefined'被全局對象替代(但只在調用本地函數對象的地方,它可能不適用於內置方法或主機方法) 。見ECMA [§15.3.4.4](http://ecma-international.org/ecma-262/5.1/#sec-15.3.4.4)和[§13.2.1](http://ecma-international.org/ ecma-262/5.1 /#sec-13.2.1) – RobG

+0

是的,RobG說的。除了上下文外,我無法說明爲'.call()'顯示的代碼片段可能帶來的好處。 (在其他代碼片段中似乎與使用'.apply()'的原因完全無關。) – nnnnnn

相關問題