Javascript中for循环的作用域

Javascript中for循环的作用域,javascript,lifetime-scoping,Javascript,Lifetime Scoping,考虑以下代码: for (var x = 0; x < 10; x++) { /* do awesome stuff. 10 times! */ } console.log(x); 现在我知道JSHint不是圣杯,但是有没有办法防止x泄漏呢?(假设这是正确的术语 我试过: (function () { "use strict"; for (var x = 0; x < 10; x++) { /* do awesome stuff. 10 times! */ }

考虑以下代码:

for (var x = 0; x < 10; x++) { /* do awesome stuff. 10 times! */ }

console.log(x);
现在我知道JSHint不是圣杯,但是有没有办法防止
x
泄漏呢?(假设这是正确的术语

我试过:

(function () {
    "use strict";

    for (var x = 0; x < 10; x++) { /* do awesome stuff. 10 times! */ }

    console.log(x);

    for (var x /* warning here */ = 0; x < 10; x++) { /* more awesome stuff */ }
})();
更糟糕的是:

console.log
invocation的行中,JSHint警告我
x
被使用超出范围,而我要重新定义的下一行
x
变量的范围仅限于JavaScript中的函数,而不是块。如果您绝对需要分别对每个for循环进行作用域,则需要这样做s:

(function () {
    for (var x = 0; x < 10; x++) { /* do awesome stuff. 10 times! */ }
})();
(function () {
    for (var x = 0; x < 10; x++) { /* more awesome stuff */ }
})();
(函数(){
对于(var x=0;x<10;x++){/*做一些很棒的事情。10次!*/}
})();
(功能(){
对于(var x=0;x<10;x++){/*更棒的东西*/}
})();

或者,您可以重用
x
变量而不重新声明它,这仍然可以正常工作。

javascript不是块作用域,而是函数作用域。函数中声明的任何变量都可以在该函数中的任何位置看到。我已经看到
在for循环中使用,而不是
var
。但是,老实说,我忽略了JSHint.函数中的所有
var
声明都被视为发生在函数的开头。没有作用域,只有函数作用域。@bozdoz
let
是JavaScript v.6的一项功能,并没有得到普遍支持。一般来说,提前声明所有变量被认为是一种良好的做法,在这种情况下,只需
>var x;
在函数的开头。这样,您就不必跟踪内联
var
s.@NiettheDarkAbsol,我发现这对于确定函数是否需要重构很有用-太多的变量可能意味着某些功能可以移到自己的函数中。
(function () {
    "use strict";

    {
        for (var x = 0; x < 10; x++) { /* do awesome stuff. 10 times! */ }
    }

    console.log(x); // STILL WORKS...

    for (var x /* warning here */ = 0; x < 10; x++) { /* more awesome stuff */ }
})();
(function () {
    for (var x = 0; x < 10; x++) { /* do awesome stuff. 10 times! */ }
})();
(function () {
    for (var x = 0; x < 10; x++) { /* more awesome stuff */ }
})();