我尝试在遵循ES6语法的一种方法中使用for of
并遇到Uncaught ReferenceError: item is not defined.
消息很明显,我已修复它。
我的问题是为什么我们必须在方法中使用它来循环时显式声明变量,而不是在全局范围内?为什么如果我们使用在全局范围内隐式声明的变量,它可以在之后的类中使用?
示例:
var arr = ["a", "b", "c", "d"];
for(i of arr){
console.log(i);
}
class bar{
constructor(arr){
this.innerArr = arr;
}
// so how this one gets reference to outside i?
yell(){
for(i of this.innerArr){
console.log(i);
}
}
}
class baz extends bar{
// in here it's obviously fine because we have var ii
yell(){
let ii
for(ii of this.innerArr){
console.log(ii);
}
}
}
class foo extends bar{
// This gives Uncaught ReferenceError
yell(){
for(item of this.innerArr){
console.log(item);
}
}
}
var br = new bar(arr);
var bz = new baz(arr);
var f = new foo(arr);
br.yell();
bz.yell();
f.yell();

它只是觉得反直觉。
答案 0 :(得分:3)
问题与for of
无关。 ECMAScript specification表示
ClassDeclaration或ClassExpression的所有部分都是严格模式代码。
在严格模式下,您无法访问尚未声明的变量。
至于为什么bar.yell()
可以访问i
:由于此代码,i
已被声明为全局变量:
for(i of arr){
console.log(i);
}
该代码在非严格模式下在全局范围内运行。因为i
被自动声明为全局变量。
答案 1 :(得分:0)
如果要在本地范围内使用该变量,则必须使用let
关键字。请参阅https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/let
可以在全局和本地范围内使用和覆盖var关键字。我认为这是因为JavaScript的历史。