2015-10-08 180 views
3

當我檢查MDN以瞭解關於閉包的一些觀點時,我遇到了下面的函數。該函數如何將參數傳遞給另一個內部函數參數

它可以是JavaScript中的已知模式,但對於java或.NET開發人員來說這很奇怪。 我想知道它是如何工作的,我知道JavaScript語言中的參數和第一類對象行爲,但如何將add5(2)分配給y變量。

function makeAdder(x) { 
    return function(y) { 
     return x + y; 
    }; 
} 

var add5 = makeAdder(5); 
var add10 = makeAdder(10); 

console.log(add5(2)); // 7 
console.log(add10(2)); // 12 
+2

我想我得到了它,造成makeAdder(x)的返回功能(y)所以add5的值是函數(y)所以當我做add5(2)我通過2到y – Marzouk

+1

閱讀http:// stackoverflow。com/questions/111102/how-do-javascript-closures-work?rq = 1 too –

回答

1

makeAdder返回函數的函數,所以變量add5add10是功能只是引用。當您使用參數值調用這些函數時,該函數將以參數y結束。

你可以做同樣的在C#中,例如,與封閉的工作原理相同:

public static Func<int, int> MakeAdder(int x) { 
    return y => x + y; 
} 

使用它:

Func<int, int> add5 = MakeAdder(5); 
Func<int, int> add10 = MakeAdder(10); 

Console.WriteLine(add5(2)); 
Console.WeiteLine(add10(2)); 
+0

我知道還有另外一個很好的答案,但是這個答案對我來說很棒,它和我說我懂的語言,謝謝。 – Marzouk

2

首先,任何時候都有命名參數 - 有一個隱式變量聲明。所以忘了上面的功能,只要考慮這個

var example = function() { 
    var x = 5; 
    return function(y) { 
    return x + y; 
    } 
} 
var inner = example(); 
console.log(inner(5)); 
> '10' 

你明白上述的工作原理嗎?如果沒有,我會建議看看JavaScript的封閉和它的意思。

Javascript Closures

在上面的函數makeAdder,唯一的區別是,我們傳遞x的值。但X是外功能仍然限定,並且所得到的返回函數關閉在其值

1

makeAdder返回一個函數,它可以看出,如:

var x = 5; 
function add5(y){ 
    return x + y; 
} 
1

makeAdder(5)調用的函數makeAdder,與結合至x 5.這個函數返回另一個函數。此外,由於提供了x的值,因此makeAdder中的匿名函數知道x的值。在這個時間點,makeAdder將返回:

function(y) { 
    return 5 + y; 
} 

因此,通過分配這個新功能ADD5,ADD5現在是一個函數,也是如此。如果我們調用add5(2),它將使用上述功能,並執行以下操作:

function(2) { 
    return 5 + 2; 
} 

將輸出7.

這是如何工作的?

閉包中定義的函數'記住'它創建的環境 。

ref

相關問題