2016-12-25 88 views
1

這是我在我的JavaScript學習跌跌撞撞最奇怪的行爲之一,JavaScript如何處理嵌套函數中的參數?

這是例子:

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

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

這是一本書Eloquent JavaScript採取的一個例子,筆者在解釋它令人困惑的方式,這使得它更奇怪:

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

誰能解釋multiplier功能的twice() 第二個電話是如何分配的參數的嵌套函數,以及如果有更多的嵌套函數是,是什麼概念,這個規則?

+0

你曾經使用C玩過嗎? – leaf

回答

0

從本質上講,乘法器在被調用時會返回一個函數。因此,當您調用乘數並將其存儲兩次時,函數將被存儲。 你可以看一下這種方式, 當您執行的console.log(兩次(5),它就像你正在執行的console.log(乘數(2)(5))

0

乘法器函數正在返回它裏面的函數。所以,在第一次調用twice將等於由乘法器功能類似下面的返回功能:

twice = function(number) { 
     return number * factor; 
     }; 

這裏的factor值傳遞給乘數功能,在第一個呼叫,將可以訪問2在其內部的函數中,即使在執行之後,這也是Closures in javascript的概念。

第二次,當你調用twice(5),它將返回傳遞給twicefactor這是之前在第一次調用傳遞的5產品。因此該產品是10