Variable not defined inside ES6 class without '

2020-04-18 06:12发布

问题:

When I use the ES6 class syntax, a variable inside a method declared without 'let' or 'var' is undefined. However, when using the regular object syntax, it is defined.

To illustrate the problem, I run the following code on 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();

produces the output:

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

Not using the class syntax solves this problem:

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();

produces:

i = 5446
j = 5446
k = 5446

Can anyone explain this behavior?

回答1:

When I use the ES6 class syntax, a variable inside a method declared without 'let' or 'var' is undefined.

Actually, it's undeclared. That's why you get an exception.

However, when using the regular object syntax, it is defined.

That's because ES6 class methods automatically run in strict mode, your regular object syntax does only run in sloppy mode. (It should not! "use strict" mode everywhere!)
Assigning to an undeclared identifier will implicitly create a global variable, a thing which you'll definitely want to avoid.

Not using the class syntax solves this problem

No, the problem is solved by properly declaring the variable.