2016-07-02 90 views
0

我在某處讀到某個函數被調用時,編譯器會將所有可見變量放在堆棧上,這也與閉包有關,現在使用下面的代碼我不確定它是否' d在像node.js這樣的併發環境中工作。在javascript中調用堆棧變量

Product.prototype.list = function(body) { 
    body.options = { 
     hostname: endPoints.product, 
     path: '/applications/' + body.entityType 
     method: 'GET' 
    }; 
    return remote.request(body) 
     .then(function(result){ 
      body[body.entityType] = result; 
      return body; 
     }); 
}; 

現在如果使用promises同時調用以下兩個函數,會發生閉包嗎?例如

product.list({entityType: "coke"}) 
    .then(console.log); //will this have {coke: []} or {pepsi: []} 

product.list({entityType: "pepsi"}) 
    .then(console.log); 
+0

我想這取決於產品是什麼? – adeneo

回答

1

是的,封閉將通過您傳遞給then的匿名函數創建。正在關閉的變量是將body值傳遞給外部函數list

每次您撥打list - 在上例中,您已經調用了兩次 - 您將向body對象添加一些值,然後實例化一個新的閉包並使其可用。您傳遞給list的每個呼叫的值都是對象文字,這意味着它們完全分開,並且您將向閉包傳遞不同的值,因此,涉及「可樂」的呼叫將無法連接到涉及'百事可樂'的電話。

+0

關於創建閉包時間的更多信息,是在函數list被調用時還是在調用了.then時創建的閉包? – user2727195

+0

@ user2727195 - 在調用list()函數時創建閉包,因爲自由變量'body'被傳入,定義並記住在該範圍內,這也在'remote.request()然後(......因爲它是詞彙的功能。 – adeneo