【发布时间】:2015-11-09 03:29:36
【问题描述】:
谁能解释一下为什么下面的代码打印“arg1 0”,而我希望它打印“arg1 hi”。是因为词法作用域吗?
runIt();
function localScoped(arg1, callback) {
console.log('arg1', arg1);
callback();
}
function runIt() {
var myValue = 0;
async.eachLimit(["hi"], 1,
function launchOneVar(clientCode, doneLaunchOneVar) {
async.waterfall([
function (myCallback) {
myValue = clientCode;
myCallback();
},
async.apply(localScoped, myValue)
], function (err, result) {
console.log(myValue);
doneLaunchOneVar(null, result);
});
},
function finishing(err) {
}
);
}
【问题讨论】:
-
你需要了解javascript代码是如何工作的,在
async.apply(localScoped, myValue)中myValue的值仍然是0,因为它会在myValue = clientCode;之前被调用,将你的代码async.apply移动到function (myCallback) {块中 -
async.apply处于瀑布流中。在第一个函数完成之前不能调用它。这就是为什么我问它与词法范围有关。请给我更多的细节?我可以重写代码来解决问题,但我想知道内部原理。 -
看我的回答,用
async.apply(localScoped)代替async.apply(localScoped, myValue) -
您的
apply在瀑布开始运行之前使用旧的 myValue 创建一个闭包。
标签: javascript node.js lexical-scope