"未被引用的参考"在方法

时间:2016-10-31 07:15:20

标签: javascript google-chrome ecmascript-6

我尝试在遵循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();




它只是觉得反直觉。

2 个答案:

答案 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的历史。