什么';在for()循环中声明的Javascript变量的作用域是什么?

什么';在for()循环中声明的Javascript变量的作用域是什么?,javascript,scope,puzzle,anonymous-function,Javascript,Scope,Puzzle,Anonymous Function,查看以下HTML/Javascript代码片段: <html> <head> <script type="text/javascript"> var alerts = []; for(var i = 0; i < 3; i++) { alerts.push(function() { document.write(i + ', '); }); } for (var j = 0; j < 3; j++) { (alerts[j])()

查看以下HTML/Javascript代码片段:

<html>
<head>
<script type="text/javascript">
var alerts = [];
for(var i = 0; i < 3; i++) {
    alerts.push(function() { document.write(i + ', '); });
}

for (var j = 0; j < 3; j++) {
    (alerts[j])();
}

for (var i = 0; i < 3; i++) {
    (alerts[i])();
}
</script>
</head><body></body></html>
这不是我所期望的-我期望的是输出
0,1,2,0,1,2,

我(错误地)假设推送到数组中的匿名函数将作为一个闭包,捕获创建函数时分配的
I
值,但实际上似乎
I
是一个全局变量

有人能解释一下在这个代码示例中,
i
的作用域发生了什么,以及为什么匿名函数没有捕获它的值吗?

在Javasript中,唯一“有趣”的词汇作用域边界是函数体。函数中任何地方声明的任何内容(嗯,除了另一个嵌套函数之外的任何地方!)都在同一范围内。声明的解释方式也有一些奇怪的地方

您的匿名函数确实充当闭包,但每个实例化的函数将共享相同的“i”。我使用的一个技巧是添加另一层功能:

for (var i = 0; i < whatever; i++) {
  (function(idaho) {
    whatever(function() { alert("my own private " + idaho); });
  })(i);
}
for(变量i=0;i

希望所有浏览器在某个时候都能支持新的“let”语句,这是一种更短、看起来不那么怪异的方法,可以完成基本相同的事情。

作用域是定义变量的函数(除了没有,所以它是全局的)

您传递的匿名函数正在访问父函数(也是全局)作用域中定义的变量

你需要一个真正的结束

alerts.push(
    function (foo) { 
        return function() { 
            document.write(foo + ', ');

        }
    }(i)
);

回答正确-谢谢但我接受了波蒂的回答,因为“我自己的隐私”+爱达荷州让我大笑。。。
alerts.push(
    function (foo) { 
        return function() { 
            document.write(foo + ', ');

        }
    }(i)
);