JavaScript变量如何工作?

pjn*_*vas 13 javascript variables scope var

我知道JavaScript变量指向一个值:

var foo = true;
//... later 
foo = false;
Run Code Online (Sandbox Code Playgroud)

所以在那个例子中我改变了foo指向true- > foo指向false,但如果我这样做:

for (var i=0; i<100; i++){
    var someVar = i;
}
Run Code Online (Sandbox Code Playgroud)

我是否为每次迭代创建了一个新的var?

以下两种方法有什么不同吗?

var myvar;
for (var i=0; i<100; i++){
    myvar = i;
}
Run Code Online (Sandbox Code Playgroud)

for (var i=0; i<100; i++){
    var myvar = i;
}
Run Code Online (Sandbox Code Playgroud)

如果是这样,为什么?

jfr*_*d00 15

Javascript ES5及更早版本中没有块范围,只有功能范围.此外,在函数范围内声明的所有javascript变量的声明会自动"提升"到函数的顶部.

因此,在循环中声明变量与在函数顶部声明它然后在循环内引用它没有任何不同.

有关一些有用的解释,请参阅这两个参考:http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoistinghttp://net.tutsplus.com/tutorials/javascript-ajax/quick-tip -javascript-hoisting-explanation /.

注意:不会提升对变量的赋值,只是变量的声明.所以,如果你这样做:

function a() {
    for (var i=0; i<100; i++){
        var myvar = i;
    }
}
Run Code Online (Sandbox Code Playgroud)

它的工作原理如下:

function a() {
    var myvar;
    for (var i=0; i<100; i++){
        myvar = i;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想在for循环中创建一个新的作用域,你可以使用IIFE(立即调用的函数表达式),如下所示:

function a() {
    for (var i=0; i<100; i++){
        (function() {
            var myvar = i;
            // myvar is now a separate variable for each time through the for loop
        })();
    }
}
Run Code Online (Sandbox Code Playgroud)

2015年更新 .ES6(或有时称为ES2015)提供了let提供块范围的声明.在这种情况下,let变量声明仅提升到当前块范围的顶部.截至2015年中期,这还没有在浏览器中广泛实现,但即将推出,它可以在服务器端环境中使用,如node.js或通过转换器.

所以,在ES6中,如果你这样做:

for (let i=0; i<100; i++){
    let someVar = i;
}
Run Code Online (Sandbox Code Playgroud)

双方isomeVar就当地只循环.


ick*_*fay 13

不,没有区别; 在JavaScript中,变量的作用域是函数级别,而不是块级别.

  • 虽然这个答案可能看起来过于简单.这是完全正确的.说实话,这很简单.如果您想要高效地使用Javascript,您必须了解功能范围与块范围,+ 1 (2认同)