2016-10-02 89 views
0

我正在讀能言善辯JS和尋找澄清這一段代碼:分配給在Javascript變量函數的附加參數受封

function multiplier(factor) { 
 
    return function(number) { 
 
    return number * factor; 
 
    }; 
 
} 
 

 
var twice = multiplier(2); 
 
console.log(twice(5)); 
 
// → 10

我瞭解封概念,但我被卡在最後一行中的方式是twice(5)。 Eloquent JS says:

「在這個例子中,乘數返回一個被凍結的代碼塊,它存儲在兩次變量中,最後一行然後調用這個變量的值,導致凍結代碼(返回數字*因子;)它仍然可以從創建它的乘法器調用中訪問因子變量,此外它還可以訪問通過其數字參數解凍時通過的參數5。「

是」額外的訪問「的論點5當解凍關閉功能時通過?當兩次是一個變量時,這是如何工作的?

+0

返回的唯一的事情就是裏面是什麼返回關鍵字後函數的大括號。 – Kunok

+0

@Kunok,不僅。它也可以訪問「因素」。 –

+0

是的,它返回表達式:'number * factor'。你可以把它看成一個單一的東西,因爲一旦它被執行,它就是一個單一的值,一個表達式的結果。 – Kunok

回答

1

如果你命名內部函數並檢查devtools,它應該更有意義。

function multiplier(factor) { 
    return function innerMultiplier(number) { 
    return number * factor; 
    } 
} 

分配時的兩倍乘法器被稱爲返回內部函數 因爲JavaScript具有頭等函數它們可以圍繞通過並由參考指定給變量

var twice = multiplier(2) 

現在innerMultiplier被分配給twice變量,但它仍然是一個可以調用的函數。

當您運行twice(5)你調用innerMultiplierfactor鎖定在它的閉合

這就是吹罰爲討好部分應用程序

+0

這只是咖啡因,而不是部分應用。部分應用程序在多參數函數的上下文中只有意義,如'const mul =(x,y)=> x * y'。 – ftor

+0

命名內部函數有很大幫助。謝謝@ synthet1c。 – dho

0

我一開始對這個語法感到困惑,好吧,但不要害怕! '兩次'變量被分配給一個稱爲閉包的特殊函數類型,它可以訪問包含函數的作用域,全局作用域和它自己的變量。但我不認爲這是混亂的真正根源,而只是你如何稱呼關閉。爲了更好地理解,我只需簡單地console.log()你的「兩次」變量。你會看到,它看上去就像一個正常的功能:

function (number) { 
     return number * factor; 
} 

就像我上眼以上,兩次(2)將返回4,因爲「因子」是包含範圍內,而它們恰巧是乘數功能,並具有2.在你的問題的值,則兩次變量其實並不是在所有

console.log(multiplier(2)(2)); 

希望必要的,有助於清楚的事情了!

+0

非常感謝@splay。這有很大幫助。 – dho

相關問題