7
我有一個for循環,裏面有一個變量賦值爲var。同樣在循環內部調用一個需要回調的方法。在回調函數內部,我使用循環中的變量。我期望它在回調函數內的值與循環迭代期間的回調之外的值相同。然而,它總是似乎是循環迭代的最後的值。node.js回調爲變量獲取意想不到的值
我誤解了JavaScript的範圍,還是有什麼不對嗎?
這裏討論的程序是一個node.js應用程序,它將監視工作目錄中的更改並在找到服務器時重新啓動服務器。我將包含所有好奇的代碼,但重要的是parse_file_list函數。
var posix = require('posix');
var sys = require('sys');
var server;
var child_js_file = process.ARGV[2];
var current_dir = __filename.split('/');
current_dir = current_dir.slice(0, current_dir.length-1).join('/');
var start_server = function(){
server = process.createChildProcess('node', [child_js_file]);
server.addListener("output", function(data){sys.puts(data);});
};
var restart_server = function(){
sys.puts('change discovered, restarting server');
server.close();
start_server();
};
var parse_file_list = function(dir, files){
for (var i=0;i<files.length;i++){
var file = dir+'/'+files[i];
sys.puts('file assigned: '+file);
posix.stat(file).addCallback(function(stats){
sys.puts('stats returned: '+file);
if (stats.isDirectory())
posix.readdir(file).addCallback(function(files){
parse_file_list(file, files);
});
else if (stats.isFile())
process.watchFile(file, restart_server);
});
}
};
posix.readdir(current_dir).addCallback(function(files){
parse_file_list(current_dir, files);
});
start_server();
從這個輸出是:
file assigned: /home/defrex/code/node/ejs.js
file assigned: /home/defrex/code/node/templates
file assigned: /home/defrex/code/node/web
file assigned: /home/defrex/code/node/server.js
file assigned: /home/defrex/code/node/settings.js
file assigned: /home/defrex/code/node/apps
file assigned: /home/defrex/code/node/dev_server.js
file assigned: /home/defrex/code/node/main_urls.js
stats returned: /home/defrex/code/node/main_urls.js
stats returned: /home/defrex/code/node/main_urls.js
stats returned: /home/defrex/code/node/main_urls.js
stats returned: /home/defrex/code/node/main_urls.js
stats returned: /home/defrex/code/node/main_urls.js
stats returned: /home/defrex/code/node/main_urls.js
stats returned: /home/defrex/code/node/main_urls.js
stats returned: /home/defrex/code/node/main_urls.js
對於那些從未來:node.devserver.js