2009-11-21 18 views

回答

11

在這種情況下,你是假設功能(1)返回一個函數,比你在呼喚與2

參數,這種新的,匿名函數看到這個例子:

function sum(a) { 
    return function(b) { 
     return a+b; 
    } 
} 

// Usage: 
window.alert(sum(5)(3));   // shows 8 

var add2 = sum(2); 
window.alert(add2(5));   // shows 7 
window.alert(typeof(add2));  // shows 'function' 

這裏我們創建一個函數sum,它需要一個參數。在函數sum的內部,我們創建了一個,它接受另一個參數。這個匿名函數是作爲執行sum的結果而返回的。

請注意,這個匿名函數是一個很好的例子,我們稱之爲closure。閉包是一個函數,它保持創建它的上下文。在這種情況下,它將保留變量a的值,如示例函數add2。如果我們創造了許多倒閉,他們是獨立的,你可以看到:

var add3 = sum(3); 
var add4 = sum(4); 

window.alert(add3(3)); // shows 6 
window.alert(add4(3)); // shows 7 

此外,他們不會得到「混亂」,如果你也有類似的命名局部變量:

var a = "Hello, world"; 

function multiply(a) { 
    return function(b) { 
     return a * b; 
    } 
} 

window.alert(multiply(6)(7)); // shows 42 

var twoTimes = multiply(2); 
window.alert(typeof(twoTimes)); 
window.alert(twoTimes(5)); 

所以,經過致電sum(2)multiply(2)結果不是數字,也不是字符串,而是function。這是functional languages的一個特性 - 可以將函數作爲參數傳遞並作爲其他函數的結果返回的語言。

+0

+1偉大的鏈接,關閉 – bguiz 2009-11-21 13:33:18

1

如果你的函數返回一個函數,你也可以調用它。

x = f(1)(2) 

等同於:

f2 = f(1) 
x = f2(2) 
1

括號表示函數的調用(你 「呼」 的話)。如果您有

<anything>() 

這意味着anything的值是一個可調用的值。想象一下以下功能:

function add(n1) { 
    return function add_second(n2) { 
     return n1+n2 
    } 
} 

然後,您可以調用它爲add(1)(2)這將等於3.您可以自然地擴展這個就像你想要的。

+0

沒有必要給一個名稱函數返回,順便說一句。 '返回函數(n2)'同樣好,輸入也少。 – 2009-11-22 06:40:31

+0

我知道。我覺得也許最好不要通過使用匿名函數來混淆手頭的問題。 – Svend 2009-11-22 12:31:39

4

您必須返回一個函數的函數:

function f(n) { 
    return function(x) { 
    return n + x; 
    }; 
} 

當你調用F(1)你到一個函數的引用回來。您可以參考存儲在一個變量,並調用它:

var fx = f(1); 
var result = fx(2); 

或者你也可以直接調用它:

var result = f(1)(2); 

爲了得到一個返回返回返回函數的函數功能的功能,你只需要重複這個過程:

function f(n) { 
    return function(x) { 
    return function(y) { 
     return function(z) { 
     return n + x + y + z; 
     } 
    } 
    }; 
} 
+1

對downvote好奇嗎?如果你不解釋你不喜歡的是什麼,那是毫無意義的...... – Guffa 2009-11-21 18:36:42

相關問題