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