当我使用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
任何人都可以解释这种行为吗?
答案 0 :(得分:5)
当我使用ES6类语法时,声明的方法中的变量没有' let'或者' var'未定义。
实际上,它是未声明的。这就是你获得例外的原因。
但是,在使用常规对象语法时,会定义它。
因为ES6 class methods automatically在strict mode中运行,因此您的常规对象语法只能以草率模式运行。 (它不应该!"use strict"
模式到处都是!)
分配到未声明的标识符will implicitly create a global variable,这是您绝对想要避免的事情。
不使用类语法解决了这个问题
不,通过正确声明变量来解决问题 。