JavaScript范围问题,嵌套函数中的var访问是未定义的

时间:2014-10-31 19:17:55

标签: javascript node.js variables scope

我在我正在使用的项目中使用了一个简单的JavaScript块(剥离),它使用了Node.js和Request

在我写入控制台的第三个例子中,我无法理解为什么变量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);
})();

1 个答案:

答案 0 :(得分: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));