レビュー要約: 関数スコープとブロックスコープの動作は同じです。あるスコープで宣言された変数はすべてこのスコープにアタッチされると考えることができます。
1. ここで 2 つの質問をし、次の 2 つのコードを提示します。最初に出力結果を考えてから、疑問があると思います。
//第一段代码 a=2; var a; console.log(a); //第二段代码 console.log(a); var a=2;
2. 結果は次のようになると思います。コードの最初の部分の結果がアンダーファイン化されていると推測し、それをブラウザ上で実行した結果が 2 であると推測します。 2 ですが、ブラウザ上で実行した結果は不十分です。兄弟!これは事実ですか(そうでないとしても、別の形で間違った推測をしているに違いないと思います)。
3. 最初のコードの結果が 2 で、2 番目のコードの結果が未定義である理由を説明しましょう。まず、var a=2 のコードが 2 つのコードのように見えるという前に述べたことを思い出してください。 JS: var a と a=2; 前者はコンパイル時に実行され、後者は実行時に実行されます。変数や関数の宣言はプログラムが実行される前に処理されますが、コードの実行順序は表示されている書き込み順序のままですか?
4. 最初のコードでは、コード var a の 2 行目がコンパイル時に最初に処理され、1 行目と 3 行目が実行時に処理されます。その後、コード全体の処理形式は次のようになります。見て!こうやって理解すれば、おお!最初に宣言し、次に割り当て、次に出力します。
5. 同じ理由で、2 番目のコードは次のように処理されます。
//第一段代码被JS这样的顺序处理了 var a; a=2; console.log(a);
A はコンパイル中に宣言されていますが、実行時には、console.log(a) が実行される前に a は存在しません。
6. コードが JS によって処理されると、
コード内の変数と関数の宣言の位置がスコープの先頭に移動されるようです、これはコンパイルプロセス中に宣言されます。優先プロセスは改善することです! 2. 各スコープがプロモートされます
//第二段代码被JS以这样的形式处理: var a; console.log(a); a=2;
グローバル スコープは foo 関数宣言をプロモートし、foo スコープでは次のように処理形式がプロモートされます。 :
foo(); function foo(){ console.log(a); var a=2; }
2. 特記事項:
関数宣言は昇格されますが、関数式は昇格されません。 名前付き関数式の場合、代入前のスコープで名前識別子を使用することはできません この 2 つの文は何を意味しますか?次の 2 つのコードは次のことを示しています: function foo(){
var a;
console.log(a);
a=2;
}
foo();
foo(); TypeError bar(); ReferenceError var foo=function bar(){ //.... }
つまり、foo には宣言がありますが、foo への代入はなく、foo は未定義であり、操作は行われません。 on unknown はもちろん操作タイプの間違いです。また、宣言されていない bar が foo の関数式で宣言されているため、宣言されていないエラーになります。
3. プロモーションの場合:
関数が最初にプロモートされ、次に変数が続きます関連する推奨事項:
JavaScript のスコープとクロージャーの詳細な説明
以上がJavaScriptのスコープとクロージャに関する知識の解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。