JavaScript循环变量范围

Bla*_*Box 57 javascript variables scope for-loop

关于JavaScript变量范围的快速问题.

为什么alert()函数打印值i而不是返回undefined

$(document).ready(function () {
    for(var i = 0; i < 10; i += 1){
    }

     alert("What is 'i'? " + i);
});
Run Code Online (Sandbox Code Playgroud)

我对JS很新,在几乎所有其他语言中我都涉及过,for循环范围内的声明将包含该循环的值,但在这种情况下不是,为什么?

What is 'i'? 10'打印.

ins*_*ere 65

请参阅MDN以获取-loop的" 初始化参数 " :for

表达式(包括赋值表达式)或变量声明.通常用于初始化计数器变量.该表达式可以选择使用var关键字声明新变量.这些变量不是循环的局部变量,即它们与for循环所在的范围相同.此表达式的结果将被丢弃.


小智 54

的JavaScript没有块作用域,直到constlet介绍,只是功能范围.由于初始化var在一个函数内,因此该变量可在同一函数中的任何其他位置访问.

来自MDN:

重要提示:JavaScript没有块范围.使用块引入的变量的范围限定为包含函数或脚本,并且设置它们的效果将持续超出块本身.换句话说,块语句不引入范围.虽然"独立"块是有效的语法,但您不希望在JavaScript中使用独立块,因为如果您认为它们在C或Java中执行类似块的操作,则它们不会按照您的想法执行操作.

  • @simonarame但是[Java和JavaScript不一样](/sf/answers/17154791/)所以这是无关紧要的...... (3认同)

Mat*_*arr 16

javascript人们正试图解决这个问题!

EcmaScript6(又名EcmaScript 2015)是去年夏天通过的最新版javascript,浏览器刚刚开始支持它的功能.

其中一个功能是具有"let"表达式的块范围局部变量.截至目前(2016年4月),主流浏览器的大多数当前版本都支持Safari,除了Safari.很少有移动浏览器支持此功能.

您可以在此处阅读更多相关信息(特别是请参阅"for循环中的let-scoped变量"部分):https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

您可以在此处查看当前的浏览器支持(查找行Bindings - > let):https: //kangax.github.io/compat-table/es6/


Hit*_*mar 10

与其他语言(例如:Java,C++,C)不同,JavaScript不支持块范围.一旦在循环或函数中声明变量,如果你这样做,它的范围就在函数体内

for(i=0; i<arr.length; i++) {
    var j=0;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

在这里,您i将成为一个全局变量,并j成为循环所在的函数或脚本的本地变量.


小智 9

for(i=0; i<arr.length; i++) {
    var j=0;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

说上面创建一个全局变量是不正确的i.我相信你应该总是使用var声明变量(除非你故意想要'属性'而不是'变量' - 这在99.99%的JS编码场景中是不太可能的......)

var在分配初始值时省略i不创建局部甚至全局变量,它正在i为全局对象创建一个属性(它看起来/表现得像一个全局变量 - 但它们有一些细微的差别).

更好的是:

var i;
for(i=0; i<arr.length; i++) {
    var j=0;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

现在循环使用全局变量i(或函数局部变量i,如果此代码出现在函数中)

有关var关键字的函数Javascript中的变量与属性的更多信息

- 注意,有点令人困惑的是你可以重新声明一个变量,例如在第二个循环中

for(var i=0; i<9; i++){
    document.write('i = ' + i + '<br>');
}


for(var i=0; i<9; i++){
    document.write('i = ' + i + '<br>');
}
Run Code Online (Sandbox Code Playgroud)

这似乎是有效的(我测试时没有错误).您似乎可以在JavaScript中重新声明变量 - 但除非有特殊情况,否则它可能不是一个好主意 - 请参阅此相关问题,提及[Google Analytics如何利用变量的'安全'重新声明](重新定义一个javascript变量)

i在这个相关的SO问题中有一些关于在JS(以及循环变量)中重新声明变量的讨论:声明循环内部或外部的变量

事件是单个变量声明的JavaScript模式