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