2013-11-14 63 views
1

我無法適應Node的單線程+異步特性,再加上javascript的函數閉包。Node.js:異步代碼+ js關閉的問題

假設我有這樣的:

function foo(bar) { 
    someAsyncFunction(function callback(err) { 
     // do stuff with 'bar' 
    }); 
} 

請讓我知道如果我失去了一些東西;但我的理解是:

  • 由於封閉,callbackbar = 42參考bar
  • 然而,如果foobar = 20調用一次,然後再次callback前從的第一次呼叫產生的中bar將是42。其他在 詞:

    1. foo(20)#1
    2. someAsyncFunction(function callback() {})#1
    3. foo(42)#2
    4. someAsyncFunction(function callback() {})#2
    5. callback()#1 ------->使用bar = 42
    6. callback()#2 ------->使用bar = 42

我正確嗎? (bar是原始對象還是對象?)。如果是這樣,我可以做些什麼來確保callback使用正確的值bar(ASIDE從bar一路向下&上調用堆棧)?感謝您的任何幫助。

回答

2

這是不正確的。每調用foo都會創建一個新的bar,因此每個回調函數都可以訪問不同的bar

如果你想在那裏只有一個bar,聲明它的foo外,這樣的foo共享相同bar每次調用:

var bar; 
function foo(arg) { 
    bar = arg; 
    someAsyncFunction(function callback(err) { 
     // do stuff with 'bar' 
    }); 
} 

這裏,foo沒有宣佈新的bar變量,而是套bar的值在更高範圍內聲明。

+0

'每次調用foo都會創建一個新欄' - 這讓我很困擾。事實上,你發佈的例子正是我所想的。謝謝您的回覆! – Colin

2

不,bar在執行第一個異步回調時仍然是20。對foo的每個呼叫都會獲得自己的bar,未受到將來致電foo的影響。

+0

感謝您的回覆。事實上你是對的,但我決定接受另一個答案,因爲他提供的例子使我能夠更容易地看到範圍問題。雖然謝謝! – Colin