2012-01-31 219 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

相关问题