如何使这个匿名Javascript函数引用正确的变量?

如何使这个匿名Javascript函数引用正确的变量?,javascript,scope,anonymous-function,Javascript,Scope,Anonymous Function,例如: var o = {}; for(var i = 0; i < 5; i++) { o[i] = function () { console.log(i); }; } o[3](); var o={}; 对于(变量i=0;i

例如:

var o = {};
for(var i = 0; i < 5; i++) {
  o[i] = function () {
      console.log(i);
  };
}

o[3]();
var o={};
对于(变量i=0;i<5;i++){
o[i]=函数(){
控制台日志(i);
};
}
o[3]();
当我调用o3时,它将始终在控制台上显示5,即使我调用o0、o4或其中任何一个。它将始终显示5,因为这是我的最后一个值。当创建匿名函数时,如何使其显示I的值?在o3中,应在控制台中显示3。

您应执行以下操作:

o[i] = (function (i) {
    return function () { console.log(i); }
})(i);
var o = {};
for(var i = 0; i < 5; i++) {
  (function(i) { // <- self-executing anonymus function with a parameter i
    o[i] = function () {
        console.log(i); // <- i here will be the argument i, 
                        //    not the i from the loop
    };
  })(i); // <- pass i as an argument
}

o[3]();
二者的结合以及Javascript中只有函数才有作用域这一事实,让您使用上面提到的技术来创建一个具有新函数的作用域,该函数保持i的状态,否则内部函数会因为闭包而改变i的状态

function outer(arg) { 
  var variable = 5;
  arg = 2;
  function inner() {
    alert(variable);  // <- the inner function has access to the variables
    alert(arg);       //     and parameters of the outer function
  }
}
(function() {
  alert("executed immediately");
})();