Javascript:变量作用域和匿名函数的问题

标签 javascript scope

我有这个示例代码:

function(){
  var events = [];
  var pages = ["a", "b", "c"];
  for(var pageIndex in pages){
    var pageName = pages[pageIndex];
    var e = function(){
      console.info(pageName);
    };
    events.push(e);
  }
  for(var eventIndex in events){
   console.info("index: " + eventIndex);
   events[eventIndex]();
  }
}

输出:

index: 0 
c 
index: 1 
c 
index: 2 
c 

期望的输出:

index: 0 
a 
index: 1 
b 
index: 2 
c 

这有标准做法吗?

最佳答案

您创建的每个 e 函数都是一个闭包,它从封闭代码访问外部变量 pageName。它将看到的 pageName 是函数运行时的值。因此,在循环结束时,pageName"c",这就是所有函数在执行时将使用的内容。

您可以通过以下方式包装函数来解决此问题,这实际上会将 pageName 的当前值绑定(bind)到您创建的函数:

function(){
  var events = [];
  var pages = ["a", "b", "c"];
  for(var pageIndex in pages){
    var pageName = pages[pageIndex];
    var e = (function(data) {
      return function() {
        console.info(data);
      };
    })(pageName);
    events.push(e);
  }
  for(var eventIndex in events){
   console.info("index: " + eventIndex);
   events[eventIndex]();
  }
}

关于Javascript:变量作用域和匿名函数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22542134/

相关文章:

c++ - 使用 goto 传递 POD 堆栈变量时的范围和生命周期

javascript - 有没有办法将 JavaScript 字符串作为某些函数执行?我正在使用 eval 但它不起作用

javascript - React - useCallback 与 useState 的 setState(prevState... 访问先前状态的区别

javascript - 当我更改屏幕尺寸时,我的 javascript 变量值出错

ruby - 获取先前作用域的局部变量

ruby-on-rails-3 - 将 Rails 3 范围合并到类方法中

c# - 使用 javascript asp.net 的网格列总计

javascript - ng-click 后的 Angular ng-csv

javascript - 如何在页面重新加载时清除 JavaScript 变量?

c++ - c++语言中的 block 作用域解析