2015-10-06 9 views
6

は、私たちの関数クロージャとそれをラップする必要がありますか? varは窓にぶら下がっていますか?またはクラスにだけ?蒸散はどうですか? Traceur /バベルは、生命維持にそれを回すとVARのにしてみましょうしていますか?安全のためにはECMAScriptの/ Javascriptを6にクラスの周りに必要な生命維持か?私は</p> <pre><code>Class Car {} </code></pre> <p>を持っている場合

(function(){ 
    Class Car() {} 
}()); 

は私がする必要がありますか?

+1

。どのようにファイルをロードしていますか? – loganfsmyth

+0

ネイティブに、それは本当に良い質問です。エッジとここにテストされ、私はそのクラス宣言で 'car.js'ファイル、および私がコンソールに' Car'を記録する場合、そのクラスを使用して '新しい-car.js'ファイルを持つことができますが、それは私を示しコンストラクタですが、 'window.Car'をログすると' undefined'と表示されます。 – Buzinas

+0

@Buzinas:それはちょっと違います。字句宣言( 'class'、' let'と 'const')はグローバルオブジェクトのプロパティにはなりません。範囲を入力するとき –

答えて

1

バベルはあなたのコードをtranspilesときあなたは何が起こるかを見てすることができますhere

クラスを非表示にする場合を除き、あなたは生命維持を使用する必要はありませんし、生成されますvar Classはとして掲揚されます任意の変数:宣言が起動時に行われますが、assignementは、元の行で行われます。

はい、バベルはletvarに変えますが、余分なアサインメントを使用して期待通りのスコープ設定も行います。 ES6コードを書いて実行したいだけなら、これらの詳細について心配する必要はなく、ES6(ES2015)標準に従ってください。

1

ない限り、それはES6モジュールとして扱われているコードでありますように、そのようにそれをラップする必要はありません。 Babelのデフォルト設定では、入力コードとファイルをモジュールとして扱います。バベルは正しいスコープセマンティクスを実装するための様々な場所での機能を紹介し、あなたが有効に適用される変圧器を持っている場合varletを変換しません。

ES6モジュールは、strictモードでは常にあり、ここでの仕様はstrictモードでの割り当てについて言っているのです:

宣言されていない識別子に割り当てあるいは解決できない参照がグローバルオブジェクトのプロパティを作成しません。シンプルな割り当てがstrictモードのコード内で発生した場合、そのLeftHandSideは解決不能参考に評価してはなりません。

http://www.ecma-international.org/ecma-262/6.0/#sec-strict-mode-of-ecmascript

あなたはに掲揚VARのget [...]クラスを行い

?:によって、正確に何を意味するのですか?

2

実際には実行コンテキストを作成し、残りのページからクラスを非表示にするクラスカーのIIFEラッパーは必要ありません。

だから、あなただけのvarはまだそれが前にいた同じように掲揚され

class Car(){} 

(ない小文字)のままにしておきます。それは実行コンテキストの最上位に吊り上げられます。コードが現在ウィンドウのコンテキストにある場合は、その場所がvarになります。

クラスはではありません。はECMAScript 6に搭載されていません。したがって、クラスは宣言された後にのみ使用可能になります。あなたがスクリプトとして、またはモジュールとしてファイルをロードする場合に依存するであろう

+0

クラスが掲揚されますかは、*結合*作成された意味が、それが初期化されていません。それは 'let'のように振る舞います。 –

+0

@FelixKling - それがMDNで言うことです。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes「関数宣言やクラス宣言の重要な違いは、関数宣言が掲揚され、クラス宣言ではないということです。」私はそれを間違って解釈しましたか?それはむしろ直接的なようです。 –

+0

MMHは、私は、http://www.ecma-international.org/ecma-262/6.0/#sec-functiondeclarationinstantiationで書かれているものを参照するステップ35.しかし、私は推測する私は思ったよりも別の意味を持つ「巻き上げました」 (多分?)。クラスと 'let'宣言は間違いなく仕様でHoistableDeclarationとみなされるので、間違っていたと思います。しかし、この仕様でさえ、「ホイスト」という用語を明示的に表現していないようです。 –

関連する問題

 関連する問題