2017-02-08 9 views
0

ES6クラス構文を使用すると、 'let'または 'var'なしで宣言されたメソッド内の変数は未定義です。ただし、通常のオブジェクト構文を使用する場合は、それが定義されます。'let'または 'var'のないES6クラス内で変数が定義されていません

問題を説明するために、私はノードの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 

誰でもこの現象を説明できますか?

+3

'class'のコードはstrictモードを使って実行されます。これにより暗黙のグローバルが禁止されます。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes#Strict_mode –

+1

私は、2番目のコード例では問題は解決しないが、むしろ問題があると主張します。 –

答えて

5

私はES6クラスの構文を使用する場合は、メソッド内の変数は「聞かせて」または「varが」未定義であるなしに宣言しました。

実際には、は宣言されていませんです。だからこそあなたは例外を取得します。

ただし、通常のオブジェクト構文を使用する場合は定義されています。

ES6 class methods automaticallystrict modeで実行されるため、通常のオブジェクト構文は控えめなモードでのみ実行されます。 (モードはどこでも!)
宣言されていない識別子will implicitly create a global variableに割り当てると、間違いなく避けたいことです。

がクラスの構文を使用しないと、この問題

を解決しません、問題がで適切に変数を宣言することでを解決しました。

+0

ありがとう!あなたが厳密なモードの外でそれを取り除くことはできますが、常にキーワードを使って変数を宣言するのは良い経験則ですか?暗黙的にグローバル変数を作成したい状況がありますか? –

+2

@BrianZanti *「グローバル変数を暗黙的に作成したい状況がありますか?」 - いいえ。このような暗黙的な動作は、意識的にコードベースに残すためのひどいトラップです。ほとんどすべてのリンターはその存在を警告し、コードレビューでは攻撃の行を直ちに拒否します。 – naomik

関連する問題