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

1 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();
Run Code Online (Sandbox Code Playgroud)

产生输出:

i = 5446
j = 5446
.../ES6Foo.js:10
    k = 5446;
      ^
ReferenceError: k is not defined
at ES6Foo.bar 
Run Code Online (Sandbox Code Playgroud)

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

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();
Run Code Online (Sandbox Code Playgroud)

生产:

i = 5446
j = 5446
k = 5446
Run Code Online (Sandbox Code Playgroud)

谁能解释这种行为?

Ber*_*rgi 5

当我使用ES6类语法时,在没有'let'或'var'的情况下声明的方法内的变量是未定义的.

实际上,这是未宣布的.这就是你得到例外的原因.

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

那是因为ES6类方法自动严格模式运行,您的常规对象语法只能以草率模式运行.(它不应该!"use strict"模式到处都是!)
分配给未声明的标识符将隐式创建一个全局变量,这是你肯定想要避免的事情.

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

不,通过适当地声明变量来解决问题.

  • @BrianZanti*"有没有你想要隐式创建一个全局变量的情况?"* - 否.这种隐式行为是一个可怕的陷阱,有意识地留在你的代码库中.几乎每个短绒都会警告他们的存在,我会立即拒绝代码审查中的进攻线. (2认同)