2012-01-31 278 views
2

我對NodeJS和JavaScript一般都很陌生。這裏是我的腳本:爲什麼Nodejs的callback()無法訪問回調範圍之外的變量?

var fs = require('fs') ; 

var temp = "???"; 

var test = function(){ 
    fs.readdir("./", function(err,result){ 
    temp = result;   // i change the temp's value 
    console.log("inter result ....."+temp);  // temp's value changed 
    setTimeout(pr,1000,"inter setTimeout: "+temp); // temp's value changed 
    }); 
} 

var pr = function (str){ 
    console.log("Print str: "+ str); 
} ; 


test(); 

setTimeout(pr,1000,"Out setTimeout print: "+temp); // Why here temp's value not change??? 

我怎樣才能更改爲回調以外的var temp的值?

+0

的'readdir'回調可能執行*之後*了'setTimeout'回調... – 2012-01-31 23:17:26

回答

1
setTimeout(pr,1000,"Out setTimeout print: "+temp); 

相同

var str = "Out setTimeout print: " + temp; 
setTimeout(pr, 1000, str); 

此時的時間temp仍然是"???"。你必須使用

setTimeout(function() { 
    pr("Out setTimeout print: "+temp); 
}, 1000); 
+0

正確:)非常感謝! – Maxium 2012-02-01 04:43:42

1

日誌語句在控制檯中出現的順序是什麼?

我沒有進入node.js,但我期望在「inter」之前看到「Out」,因爲我猜fs.readdir()函數是異步的,並且您提供給它的回調函數將會直到您已在代碼的最後一行撥打setTimeout()之後纔會執行此操作,此時temp尚未更改。

也就是說,執行我希望從你的代碼的順序是:

  1. 定義fs
  2. 定義temp設置爲???
  3. 定義test功能
  4. 定義pr功能
  5. 致電test()功能
  6. test()調用內fs.readdir()但隨後從test()立即返回,而不必尚未執行
  7. setTimeout(pr,1000,"Out setTimeout print: "+temp);回調(其中temp在那一刻的價值 - 仍然是「???」 - 成爲字符串的一部分setTimeout的會通到pr
  8. fs.readdir()的回調被執行,只有在那麼temp被更改。 「inter」超時被設置。
+0

是的,你的分析是正確的, 「的setTimeout(PR,1000,」 走出的setTimeout打印:「+ temp);「在這個memont,temp是」???「我將它改爲「setTimeout(function(){setTimeout(goOn,0,」out setTimeout「+ temp);},1000);」得到了正確的結果; – Maxium 2012-02-01 04:53:32

+0

你爲什麼使用雙'setTimeout'?一旦你包含了匿名函數,你應該可以說'setTimeout(function(){goOn(「out setTimeout」+ temp);},1000);' – nnnnnn 2012-02-01 05:37:40

+0

是的,setTiemout包含匿名函數是更好的辦法! – Maxium 2012-02-01 13:53:20

相關問題