【问题标题】:Variable not defined inside ES6 class without 'let' or 'var'没有“let”或“var”的 ES6 类中未定义变量
【发布时间】:2017-02-08 17:27:56
【问题描述】:

当我使用 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

谁能解释这种行为?

【问题讨论】:

标签: javascript node.js ecmascript-6


【解决方案1】:

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

实际上,它是未声明的。这就是你得到异常的原因。

但是,当使用常规对象语法时,它是被定义的。

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

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

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

【讨论】:

  • 谢谢!始终使用关键字声明变量是否是一个好的经验法则,即使您可以在严格模式之外摆脱它?是否有过需要隐式创建全局变量的情况?
  • @BrianZanti “有没有你想要隐式创建全局变量的情况?” - 没有。这种隐式行为是一个可怕的陷阱,需要有意识地留在你的代码库。几乎每个 linter 都会警告它们的存在,我会立即拒绝代码审查中的冒犯性行。
猜你喜欢
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 2017-04-22
相关资源
最近更新 更多