function logCar(logMsg, callback){
process.nextTick(function() {
callback(logMsg);
});
}
var cars = ["Ferrari", "Porsche", "Bugatti"];
for (var idx in cars){
var message = "Saw a " + cars[idx];
logCar(message, function(){
console.log("Normal Callback: " + message);
});
}
for (var idx in cars){
var message = "Saw a " + cars[idx];
(function(msg){
logCar(msg, function(){
console.log("Closure Callback: " + msg);
});
})(message);
}
"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe callback_closure.js
Normal Callback: Saw a Bugatti
Normal Callback: Saw a Bugatti
Normal Callback: Saw a Bugatti
Closure Callback: Saw a Ferrari
Closure Callback: Saw a Porsche
Closure Callback: Saw a Bugatti
Process finished with exit code 0
从上面的代码的输出结果我们来分析:
1.process.nectTick()是异步,在for循环之后执行的回调。
2.在第一个for循环中message对于logCar来说是一个全局变量,每次循环都会改变message,这样最终执行回调是message是最后的值
3.在第二个for循环中使用闭包嵌套了一个函数,每次传个匿名函数的值是message的一个拷贝,每次回调输出时并不是全局变量message,所以会正确输出。