【问题标题】:JavaScript scope issue, var access in nested function is undefined [duplicate]JavaScript范围问题,嵌套函数中的var访问未定义[重复]
【发布时间】:2014-12-28 04:51:06
【问题描述】:

我正在使用 Node.js 和 Request 的项目中提供一个简单的 JavaScript 块(精简)。

在我写到控制台的第三个实例中,我看不出为什么变量xxxundefined。我知道这是一个范围问题,但我认为像这样的嵌套函数可以访问其父范围内的变量。

我确定我误解了范围,因为它与这种情况有关。有人可以向我解释是什么阻止了对这个变量的访问,或许还有关于如何将这个变量传递给这个函数以供使用的建议?

更新 - 以下逐字代码:

在下面的例子中,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


【解决方案1】:

试试这个,在上下文切换的情况下这样更安全:

var xxx = "HEY LOOK AT ME";
console.log(xxx); // <-- "HEY LOOK AT ME"
var opts = { url: "http://example.com/foobaz" };
console.log(xxx); // <-- "HEY LOOK AT ME"

request(opts, function(e) { return function (error, response, body) {
  console.log(e);
  if (!error && response.statusCode == 200) {
    // stuff happens here
  }
}}(xxx));

【讨论】:

  • 哦,有趣。这就是我将变量传递给该函数的方式。谢谢你的信息!如果一切都失败了,我一定会尝试这种方法。
猜你喜欢
  • 2019-04-30
  • 2021-04-03
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多