以前、関数と変数の名前が同じ場合、関数宣言の昇格によって変数宣言の昇格が上書きされるのではないかと考え、次のコードをテストしました
リーリーconsole.log(f)の出力は位置によって異なりますが、誰が誰を上書きしたのか、それとも何か別の理由があるのでしょうか?
説明をお願いします
黄舟2017-06-12 09:30:15
最初の段落
リーリー=>
と同等 リーリー第 2 段落
リーリー=>
と同等 リーリー参照
https://www.zhihu.com/questio...
某草草2017-06-12 09:30:15
ブロック内にない関数を定義する場合は、最初に関数をホイストしてから変数宣言を行ってください。ECMAScript 5、セクション 10.5 を参照してください。
例は次のとおりです:リーリー
上記の出力は関数です。未定義ではないので、最初に関数をプロモートし、次に変数宣言をプロモートします。PHP中文网2017-06-12 09:30:15
JS インタープリターは最初に var
ステートメントをプロモートします。 は代入ステートメントではなく var 宣言ステートメントをプロモートすることに注意してください。
それでは関数宣言を進めていきます。したがって、上記の状況が形成されます
2番目の場合は、吊り上げとは関係ないと思います。それも改良して出力していますが。 。したがって、JS が弱い型付け言語であることを証明するには良い選択です = =
var f
,但这里关键在于执行赋值 f = 2
为情所困2017-06-12 09:30:15
最初のコードは変数昇格、var f=unknown で、変数 f は関数を指します。2 番目のコードは JavaScript の実行順序に従って f に 2 を割り当てます。
漂亮男人2017-06-12 09:30:15
jsを実行すると上から下へ実行されます。
リーリーこのコードでは、関数宣言 function f と変数宣言 var f が一緒にプロモートされますが、関数宣言の優先順位が高くなるため、
コードは次のようになります。
リーリー
2番目のコード
リーリー
上記のメソッドを使用して を理解すると、JS エンジンによって
として理解されます
リーリー
黄舟2017-06-12 09:30:15
リーリー
ycloudが言っているように、上記の理由は「関数定義の昇格はifのブロックスコープにのみ昇格される」ためです
リーリー関数定義が if ブロック スコープにのみプロモートされる場合、上記の理由は何ですか? (Chrome58テスト) ifブロックスコープ内の関数に外部からアクセスできるのはなぜですか?