2012-07-27 184 views
2

我有一個功能的Javascript,執行功能

var hideAll = function() { 
    // code 
    return ///... 
    }; 

,我使用置身於另一個回調函數此功能。
當我使用它像

function (params, hideAll) {} 

一切運作良好,但是當我使用

function (params, hideAll()) {}  

一切都不盡如人意!

所以我的問題是,hideAllhideAll()函數執行有什麼區別?

+0

hideAll是一個變量,它正在嘗試函數。和hideAll();是執行功能。 – Shreedhar 2012-07-27 07:20:42

回答

3

hideAll - 這是功能
hideAll()參考 - 這是函數的執行,其結果

function (params, hideAll) {}是一個正確的函數定義,
function (params, hideAll()) {}不 - 你不能調用另一個函數定義中的函數。

但是你仍然可以寫下面的有效代碼:

  var hideAll = function() { 
    // code   
    return ///...   
  };   

    var functionWithCallback = function(callback){ 
     callback(); 
    } 
    var closureReferringHideAll = function(){ 
     hideAll(); 
    } 

    // The following two lines will do exactly the same in current context, 
    // i.e. execute hideAll. 
    functionWithCallback(hideAll); 
    closureReferringHideAll(); 
+0

感謝您的解釋! – Ilya 2012-07-27 07:21:33

+0

@Ilya歡迎您。 – Li0liQ 2012-07-27 07:34:10

0

hideAll()不是一個函數,它是執行功能的結果。

function hideAll(){ 
    return 0; 
} 

hideAll() - 數0

hideAll - 功能

0

讓我們回來了一下,假設你調用一個方法foo 首先是這樣的:

foo(params, hideAll()) {} 

這使用返回值hideAll的爲價值

foo(params, hideAll) {} 

採用hideAll功能本身作爲值

不過,你真的試圖做的是聲明功能像這樣:

function (params, hideAll()) {} 

這沒有意義。您不能聲明函數與任何不同於參數列表中的參數。

因此,儘管這兩種形式都是合法的函數調用(仍與總不同的含義),後者是不合法的函數聲明

0

JavaScript和其他許多語言的功能是「一流對象「,這意味着你可以調用/執行一個函數,但你也可以將該函數存儲在一個變量或一個數組中,或者你可以將一個函數傳遞給另一個函數。

請注意,我不是在談論傳遞調用函數產生的值......而是函數本身。考慮:

function test10(f) { 
    for (var i=0; i<10; i++) 
     alert(f(i)); 
} 

function square(x) { return x*x*; } 
function cube(x) { return x*x*x; } 

test10(square); 
test10(cube); 

最後兩行正在傳遞函數(squarecube)作爲參數起作用test10

()語法告訴您要撥打電話,並可以用函數名,不僅使用的JavaScript,但像變量或數組元素的任何表達......例如:

var f_arr = [square, cube]; 
for (var i=0; i<2; i++) 
    alert(f_arr[i](i+42)); // Will call square(42) and cube(43) 

其實在Javascript代碼

function square(x) { 
    return x * x; 
} 

是不相同,但類似於

square = function(x) { 
    return x * x; 
}; 

因此定義一個函數確實接近於分配一個變量