7
for(var i=0;i<5;i++){}
alert(i);

在 javascript 中,这将为我们提供 5 种其他语言,如 C++、java、c# .... 只会给出一个错误,即 i 变量未在上下文中定义。

那么为什么for循环计数器在退出javascript循环后没有被破坏呢?

4

3 回答 3

11

这是因为 JavaScript 引擎会将变量声明移动(“提升”)到函数的顶部,无论它在函数1中的什么位置声明。JavaScript 没有块作用域。

{
//Some code
    for(var i=0;i<5;i++){}
    alert(i);
//Some code
}

相当于:

{
  var i;
 //.. some code
 for(i=0;i<5;i++){}
    alert(i);
}

1除非是用catch子句捕获的异常;该变量的范围为catch阻塞。

更新

为了定义块范围变量,ecmascript 6 规范(javascript 1.7)引入了let。目前这仅适用于最新版本的 FireFox 浏览器和共识阶段。

<script type="application/javascript;version=1.7">
     //Some code

        for (let i = 0; i < 10; i++) {

            alert(i); // 1, 2, 3, 4 ... 9
        }

        alert(i); // Here you will get an error here saying ReferenceError: i is not defined.
    }
</script>

小提琴

于 2013-07-04T17:14:57.753 回答
3

Javascript 只为函数withcatch块创建作用域(函数为var语句创建作用域),因此等效于 Java(并且不工作)将是:

(function(){
    for(var i=0;i<5;i++){}
})();
alert(i);
于 2013-07-04T17:17:14.450 回答
0

Javascript 中var hoisting的变量受 javascript 引擎在块上方声明变量的影响。

有关如何工作的示例, 请参阅var 上的 Mozilla Javascript 文档。

于 2013-07-04T17:17:07.957 回答