【发布时间】:2014-12-28 04:51:06
【问题描述】:
我正在使用 Node.js 和 Request 的项目中提供一个简单的 JavaScript 块(精简)。
在我写到控制台的第三个实例中,我看不出为什么变量xxx 是undefined。我知道这是一个范围问题,但我认为像这样的嵌套函数可以访问其父范围内的变量。
我确定我误解了范围,因为它与这种情况有关。有人可以向我解释是什么阻止了对这个变量的访问,或许还有关于如何将这个变量传递给这个函数以供使用的建议?
更新 - 以下逐字代码:
在下面的例子中,groups 被定义在顶部并且是一个根级变量。
(function getListings() {
for (var i = 0; i < groups.length; i++) {
console.log("1: " + JSON.stringify(groups[i]));
var listingReqOptions = { url: format(listingsEndpoint, { "groupID": groups[i][1], "listingID": groups[i][0] }) };
console.log("2: " + JSON.stringify(groups[i]));
request(listingReqOptions, function (error, response, body) {
console.log("3: " + JSON.stringify(groups[i]));
if (!error && response.statusCode == 200) {
var channel = format(listingsChannelTemplate, { "groupID": groups[i][1], "listingID": groups[i][0] });
console.log("adding channel: " + channel);
listingChannels[channel] = JSON.parse(body);
}
else {
console.log("An error occurred while retrieving listing data: " + JSON.stringify(response));
}
});
}
// Loop
setTimeout(getListings, 3000);
})();
【问题讨论】:
-
看来您可能已经将示例剥离得太远了。您发布的 sn-p 不应该有您描述的问题。寻找除此之外的
xxx的任何其他用途。它是在其他任何地方分配或声明的吗? -
如果必须立即调用,请尝试使用bind,(function getListings() { / your code }).bind(xxx)();
-
修改后的sn-p请看“JavaScript closure inside loops – simple practical example”。
request()是异步的问题,所以在for循环已经继续递增i之后完成,此时groups[i]相当于groups[groups.length]。 -
看起来像JavaScript closure inside loops – simple practical example 的经典案例——当任何
request调用解决时,循环已经完成并且i越界 -
我认为这个副本应该回答你的问题。如果您认为副本不能帮助您解决问题,请编辑您的问题以突出显示您对副本中的答案的不理解之处,我很乐意重新打开。
标签: javascript node.js variables scope