2015-12-21 65 views
6

這個問題可以在別處回答,但我當時甚至不知道如何開始尋找答案。我是JavaScript新手,所以這是一個讓我明白的難題。返回函數Chrome瀏覽器開發工具

給出下面的代碼:

function multiple(n) { 
    function f(x) { 
     return x * n; 
    } 
    return f; 
} 
var triple = multiple(3); 
var quadruple = multiple(4); 

當我通過以下到控制檯:

console.log(triple(5)); 

我得到了我希望,那就是15同樣地與任意數量的,它會增加三倍(如果我使用第二個功能則增加四倍)。

但是當我三重式到控制檯我得到下面的代碼:

f(x) { 
    return x * n; 
} 

應該不是控制檯返回...

f(x) { 
    return x * 3; 
} 

...自從3被編碼成功能憑藉以下代碼:

var triple = multiple(3); 
+5

你有點回答你的問題,3不是'編入'f,而是將它作爲參數傳入。控制檯只顯示它的功能來源。現在你的源代碼裏有x * 3. – pvg

+0

這就是所謂的[closure](https://www.wikiwand.com/en/Closure_(computer_programming))。另見[「詞彙環境:共同理論」](http://dmitrysoshnikov.com/ecmascript/es5-chapter-3-1-lexical-environments-common-theory/) – user2683246

回答

3

3不是硬編碼到函數中。的f代碼指的是變量n,數量不限3。在代碼中,恰巧有沒有辦法修改n,但是想象一下一些代碼那裏修改n道:

function multiple(n) { 
    function f(x) { 
     return x * n; 
    } 
    function modifyN(newN) { 
     n = newN; 
    } 
    return { f: f, modifyN: modifyN }; 
} 
var resultFor3 = multiple(3); 
var triple = resultFor3.f; 
var modifyTripleN = resultFor3.modifyN; 

正如你可以看到n沒有硬編碼;這與其他變量沒有什麼不同。在您的具體示例中,在終止multiple之後無法修改n,但這不會使以任何方式「硬編碼」調用multiple時創建的閉包內部的值。

2

那麼,它是一樣的,如果你有:

var n = 3; 
    function f(x) { 
    return n * x; 
    } 

如果您登錄f,你會看到上面的功能,但是當你把它n會從作用域鏈稱爲n最接近變量得到它的價值,在我們的例子n = 3,爲n值聲明在全球範圍內。

我不知道其中JS引擎存儲的是瓶蓋內的n變量(在你的情況下,由multiple函數創建的閉包)的具體方式,但什麼是最重要的事情是,閉包內的變量通過reference不是值保存。

2

打字triple只顯示您的功能的源代碼

因爲3

藉助於下面的代碼

即不正確的陳述的編碼到功能。你並沒有改變函數的源代碼。要更改源代碼,你將不得不重新定義整個功能。你所做的只是傳入一個參數。控制檯正在給你正確的輸出。

當你傳遞一個參數的函數,在一個高的水平,在運行時,它只是在尋找任何值存儲在內存地址的變量(或類似的東西)。但它不會重寫函數的源代碼。

相關問題