Javascript块级别范围

时间:2016-04-27 06:45:08

标签: javascript scoping

有人可以解释我的javascript块级别范围。

我无法复制w3schools给出的以下示例;

enter image description here

2 个答案:

答案 0 :(得分:0)

直到ES5,JS不支持block级别范围。 block我指的是{}

中包含的任何代码

因此,如果您使用其他块级语言(如C#,Java,C ++等)编写相同的代码,则变量i仅适用于由{} for分隔的区域。 {1}}循环。在循环之外它是不可访问的。

但是,在ES6世界中,事情有点不同,或者更好地说,were different在ES6之前允许block level scope使用let关键字。

所以上面的代码被解释为

var i; // i is declared in the containing scope
for(i = 0; i < 10; i++) {
  ... // some code
}
return i; // therefore accessible here

如果这是块级范围,那么i将无法在外部访问for循环。

for(var i = 0; i< 10; i++){

}

return i; // i is not accessible here in block scoped language

答案 1 :(得分:0)

在最新版本的Javascript(ES6 / ES2015)发布之前,Javascript只有本地范围和全局范围。以下是本地范围的示例:

function x(){
  var y = 1
}
console.log(y) // undefined because y is in the local scope of function x

以下是全球范围的示例:

var a = 1
function sayOne() {
  console.log(a) // prints 1 because the "a" variable is global
}

因此,在全局范围内,变量基本上对程序中的其他所有内容都可见,但在本地范围内,它隐藏在父函数之外的所有内容中。

如截图所示,Javascript没有块级范围。所以你提供的代码将返回i,尽管它是for循环块的OUTSIDE。

for (var i = 0, i < 10) {
// some code here
}
return i // this will return i since i is global and will not be undefined

但是使用块作用域,变量将仅存在于该代码块中,例如使用循环。让我们看看相同的代码,但是使用ES6块作用域“let”,它与“var”的作用相同,但具有块作用域。

for (let i = 0, i < 10) {
// some code here
}
return i // this will now return undefined because i is only defined within 
// the for loop