为什么Nodejs的callback()无法访问回调范围之外的变量?
我对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的值?
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);
正确:)非常感谢! – Maxium 2012-02-01 04:43:42
日志语句在控制台中出现的顺序是什么?
我没有进入node.js,但我期望在“inter”之前看到“Out”,因为我猜fs.readdir()
函数是异步的,并且您提供给它的回调函数将会直到您已在代码的最后一行拨打setTimeout()
之后才会执行此操作,此时temp
尚未更改。
也就是说,执行我希望从你的代码的顺序是:
- 定义
fs
- 定义
temp
设置为???
- 定义
test
功能 - 定义
pr
功能 - 致电
test()
功能 -
test()
调用内fs.readdir()
但随后从test()
立即返回,而不必尚未执行 -
setTimeout(pr,1000,"Out setTimeout print: "+temp);
回调(其中temp
在那一刻的价值 - 仍然是“???” - 成为字符串的一部分setTimeout的会通到pr
) -
fs.readdir()
的回调被执行,只有在那么temp
被更改。 “inter”超时被设置。
是的,你的分析是正确的, “的setTimeout(PR,1000,” 走出的setTimeout打印:“+ temp);“在这个memont,temp是”???“我将它改为“setTimeout(function(){setTimeout(goOn,0,”out setTimeout“+ temp);},1000);”得到了正确的结果; – Maxium 2012-02-01 04:53:32
你为什么使用双'setTimeout'?一旦你包含了匿名函数,你应该可以说'setTimeout(function(){goOn(“out setTimeout”+ temp);},1000);' – nnnnnn 2012-02-01 05:37:40
是的,setTiemout包含匿名函数是更好的办法! – Maxium 2012-02-01 13:53:20
的'readdir'回调可能执行*之后*了'setTimeout'回调... – 2012-01-31 23:17:26