ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptのスコープとクロージャに関する知識の解説

JavaScriptのスコープとクロージャに関する知識の解説

php是最好的语言
php是最好的语言オリジナル
2018-08-09 11:36:071791ブラウズ

レビュー要約: 関数スコープとブロックスコープの動作は同じです。あるスコープで宣言された変数はすべてこのスコープにアタッチされると考えることができます。

1.これはなぜですか?

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. 各スコープがプロモートされます

1. 次のコードを見てください:

//第二段代码被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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。