for(var i=0;i<5;i++){}
alert(i);
在 javascript 中,这将为我们提供 5 种其他语言,如 C++、java、c# .... 只会给出一个错误,即 i 变量未在上下文中定义。
那么为什么for循环计数器在退出javascript循环后没有被破坏呢?
for(var i=0;i<5;i++){}
alert(i);
在 javascript 中,这将为我们提供 5 种其他语言,如 C++、java、c# .... 只会给出一个错误,即 i 变量未在上下文中定义。
那么为什么for循环计数器在退出javascript循环后没有被破坏呢?
这是因为 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>
Javascript 只为函数with
和catch
块创建作用域(函数为var
语句创建作用域),因此等效于 Java(并且不工作)将是:
(function(){
for(var i=0;i<5;i++){}
})();
alert(i);
Javascript 中var hoisting
的变量受 javascript 引擎在块上方声明变量的影响。
有关如何工作的示例, 请参阅var 上的 Mozilla Javascript 文档。