Ich habe eine for-Schleife, in der eine Variable mit var zugewiesen ist. Außerdem wird innerhalb der Schleife eine Methode aufgerufen, die einen Rückruf erfordert. Innerhalb der Callback-Funktion verwende ich die Variable aus der Schleife. Ich würde erwarten, dass ihr Wert innerhalb der Callback-Funktion derselbe ist, wie er außerhalb des Callbacks während der Iteration der Schleife war. Es scheint jedoch immer der Wert aus der zuletzt Iteration der Schleife.
Verstehe ich scope in JavaScript falsch, oder ist etwas anderes falsch?
Das Programm, um das es hier geht, ist eine node.js-App, die ein Arbeitsverzeichnis auf Änderungen überwacht und den Server neu startet, wenn sie eine Änderung findet. Ich füge den gesamten Code für Neugierige bei, aber das Wichtigste ist die Funktion 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();
Das Ergebnis ist:
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
Für diejenigen, die aus der Zukunft kommen: node.devserver.js