javascript 関数宣言のプロモーション、関数本体も一緒にプロモーションされますか?
が でない場合、次の反例があります:
リーリーが の場合、次の反例があります:
リーリー最初の例は、関数本体もプロモートされることを示しています。この考え方に従って 2 番目のコードを理解すると、「名前変更」関数が相互にカバーし、後の関数が前の関数をカバーすることになります。 console.log( func) は文字列「function func() {console.log('22');};」を出力しますが、実際にはそうではありません。
3 つの疑問が生じます:
「変数のプロモーション、機能の優先順位」をどのように理解していますか?
関数本体も改良されているのでしょうか?
2 番目のコードの実行結果を解釈するにはどうすればよいですか?
習慣沉默2017-05-19 10:45:15
if は条件判定を表します。コンパイル中にコードは実行されず、構文と字句解析のみがチェックされます。ブラウザを変更してみたり、テスト用に厳密モードを有効にしてみると、予期せぬことが起こる可能性があります~
。1. 変数の昇格、関数の優先順位、つまり var a = 1; function fun(){}; および function fun(){} がスコープの最上位に昇格されます。
2.も改善されました。関数式は var fun = function(){}; なので、そうではありません。この種の関数は var fun のみを改善します
3. 2 番目の段落は、実際には次のように説明できます
某草草2017-05-19 10:45:15
非厳密モードでは、if ステートメント内に配置された関数宣言がプロモートされるかどうかは、各カーネルの実装によって異なります。
結論としては機能は改善されますが、if文内での各コアの実装に依存します。
厳密モードでは、スクリプトまたは関数レベルではない関数宣言が禁止されます
PHP中文网2017-05-19 10:45:15
関数と変数の宣言はプロモートされます。関数のプロモートは変数のプロモートよりも優先されます。最初のコードは直接改良されています。 2 番目のコードで定義した関数は、if ステートメント構造内にあります。2 つのログと if は、実行中のスタックで順番に実行される必要があります。明らかに、関数は if ステートメントが実行される前に宣言されていません。
怪我咯2017-05-19 10:45:15
es6 にはブロックレベルのスコープ ルールがいくつかあり、古いバージョンのノードまたは以前のバージョンの Chrome で実行すると、次のコードと同等になります
。
リーリー
仅有的幸福2017-05-19 10:45:15
JavaScript は関数レベルのスコープであるため (function-level scope
)
所以if中并没有独立维护一个scope
英語の説明:
javascript-variable-scope-and-hoisting-explained
中国語の説明: Javascript スコープと変数ホイスティング
PHP中文网2017-05-19 10:45:15
一般に、条件ステートメントで関数宣言を記述することは推奨されません。
これは ECMAScript の無効な構文であり、JavaScript エンジンはエラーを修正し、通常の適切な状態に変換しようとします。ただし、この修正方法はブラウザごとに異なります。関数式を使用することをお勧めします:
var func;
if(true){
}その他{
リーリー}