javascript范围隐私破坏?

Par*_*x13 8 javascript scope

所以我刚刚在javascript项目上工作时遇到了一些奇怪的事情,这里有一个我很困惑的情况的简单示例:

function doSomething() {
    for(var d = 0;d < 10;d++) {
        var shouldBePrivate = 5;
    }

    for(var d = 0;d < 10;d++) {
        console.log(shouldBePrivate);
    }
}
Run Code Online (Sandbox Code Playgroud)

当你调用doSomething()时,可以在2nd for循环中访问shouldBePrivate变量.

不应该不可能吗?

Sur*_*tta 5

javascript中的所有局部变量都有函数作用域而不是块作用域(至少之前ECMAScript 2015).这意味着函数内部声明了变量,可用于整个函数.

您所指的是块范围.不幸的是,在Javascript中的noblock范围ECMA2015.从 ECMAScript 2015,您可以声明您的变量,let只能在块中引用它们,并且一旦您离开该块,它们就会死亡.

MDN文档说(带例子)

块范围规则

随着var

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

example:

var x = 1;
{
  var x = 2;
}
console.log(x); // logs 2
Run Code Online (Sandbox Code Playgroud)

这会记录2,因为块中的var x语句与块之前的var x语句位于相同的范围内.在C或Java中,等效代码将输出1.

用let和const

相比之下,使用let和const声明的标识符具有块范围:

let x = 1;
{
  let x = 2;
}
console.log(x); // logs 1
The x = 2 is limited in scope to the block in which it was defined.
Run Code Online (Sandbox Code Playgroud)