所以我刚刚在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变量.
不应该不可能吗?
javascript中的所有局部变量都有函数作用域而不是块作用域(至少之前ECMAScript 2015).这意味着函数内部声明了变量,可用于整个函数.
您所指的是块范围.不幸的是,在Javascript中的noblock范围ECMA2015.从 ECMAScript 2015,您可以声明您的变量,let只能在块中引用它们,并且一旦您离开该块,它们就会死亡.
块范围规则
随着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)