为什么Nodejs callback()无法访问回调范围外的变量?

时间:2012-01-31 23:12:05

标签: javascript node.js javascript-events

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

如何在回调之外更改var temp的值?

2 个答案:

答案 0 :(得分: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的字符串的一部分)< / LI>
  8. 执行fs.readdir()的回调,只有temp才会被更改。 “inter”超时设置。

答案 1 :(得分: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);