为什么Nodejs的callback()不能访问外部callback范围的variables?

我对NodeJS和JavaScript一般都比较陌生。 这是我的脚本:

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??? 

我怎样才能改变callback以外的var temp的值?

 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); 

日志语句在控制台中显示的顺序是什么?

我没有进入node.js,但我希望在“inter”之前看到“Out”,因为我猜fs.readdir()函数是asynchronous的,并且你提供给它的callback函数将会直到你的代码的最后一行已经调用了setTimeout()之后, temp才会被执行。

也就是说,我期望从你的代码执行的顺序是:

  1. 定义fs
  2. 定义temp设置为???
  3. 定义testfunction
  4. 定义pr函数
  5. 调用test()函数
  6. test()调用fs.readdir() ,然后立即从test()返回而没有执行callback
  7. setTimeout(pr,1000,"Out setTimeout print: "+temp); (在那一刻temp的值仍然是“???”)成为setTimeout在一秒钟内传递给pr的string的一部分)
  8. fs.readdir()的callback被执行,只有这样temp才会被修改。 “内部”超时设置。