没有'let'或'var'的ES6类中未定义的变量

时间:2017-02-08 17:27:56

标签: javascript node.js ecmascript-6

当我使用ES6类语法时,未声明没有'let'或'var'声明的方法内的变量。但是,在使用常规对象语法时,会定义它。

为了说明问题,我在Node v7.5.0上运行以下代码:

class ES6Foo {

   bar() {  

       var i = 5446;
       console.log("i = " + i);

       let j = 5446;
       console.log("j = " + j);

       k = 5446;
       console.log("k = " + k);

    }
}

foo = new ES6Foo();
foo.bar();

产生输出:

i = 5446
j = 5446
.../ES6Foo.js:10
    k = 5446;
      ^
ReferenceError: k is not defined
at ES6Foo.bar 

不使用类语法解决了这个问题:

var OldFoo = function() {}

OldFoo.prototype.bar = function() {

   var i = 5446;
   console.log("i = " + i);

   let j = 5446;
   console.log("j = " + j);

   k = 5446;
   console.log("k = " + k);

}

foo = new OldFoo();
foo.bar();

产生

i = 5446
j = 5446
k = 5446

任何人都可以解释这种行为吗?

1 个答案:

答案 0 :(得分:5)

  

当我使用ES6类语法时,声明的方法中的变量没有' let'或者' var'未定义。

实际上,它是未声明的。这就是你获得例外的原因。

  

但是,在使用常规对象语法时,会定义它。

因为ES6 class methods automaticallystrict mode中运行,因此您的常规对象语法只能以草率模式运行。 (它不应该!"use strict"模式到处都是!)
分配到未声明的标识符will implicitly create a global variable,这是您绝对想要避免的事情。

  

不使用类语法解决了这个问题

不,通过正确声明变量来解决问题