ホームページ  >  記事  >  ウェブフロントエンド  >  Javascriptのスコープ+クロージャの詳細説明

Javascriptのスコープ+クロージャの詳細説明

php是最好的语言
php是最好的语言オリジナル
2018-08-04 10:45:072477ブラウズ

スコープ:

[[スコープ]]:すべての JavaScript 関数はオブジェクトです。オブジェクト内の一部のプロパティはアクセスできますが、一部のプロパティは JavaScript エンジン [ [スコープ] からのみアクセスできます。 ]] もその 1 つです。

[[scope]] は、実行時コンテキストのコレクションを保存するスコープと呼ばれるものを指します。実行コンテキスト: 関数が実行されると、実行コンテキストと呼ばれる内部オブジェクトが作成され、関数が実行されるたびに対応する実行コンテキストは一意になるため、関数を複数回呼び出します。その結果、複数の実行コンテキストが作成され、関数の実行が完了すると、生成された実行コンテキストは破棄されます。

スコープ チェーン: [[スコープ]] に格納されている実行コンテキスト オブジェクトのコレクション。このコレクションはチェーンで接続されています。このチェーン リンクをスコープと呼びます。

function a(){
    function b(){
        function c(){
        }
    }    

}

a が a.[[scope]] を定義 ===> 0: GO

a が a.[[scope]] を実行 0: aAO

1: GO

b が定義されました。 [[スコープ] ===&gt:go

b定義b。 ===> 0: bAO

2:GO

c 定義 c.[[スコープ]] ===> 0: cAO

1:baO

2: AAO g 3: GO

閉店

内部関数を外部に保存するとクロージャが生成され、元のドメインチェーンがおかしくなりメモリリークが発生します。

function a(){
    function b(){
        var bbb = 234;
           console.log(aaa);
    }
    var aaa = 123;
    return b;
}
var glob = 100;
var demo = a();
demo();

a 関数は破棄される前に b 関数を返すため、b 関数によって生成されたスコープ チェーンは破棄されず、この時点では b 関数は実行されません。 (aaa)、b関数が実行されます。 bAOには変数aaaがないので、親aAOに戻ると、aaa = 123が見つかり、結果は123になります。

では、どうすればその前にb関数を実行できるでしょうか。戻ってくる?

即時実行関数の紹介

初期化関数の関数として、

1. (function () {} ()) (w3c は最初のタイプを推奨します) Javascriptのスコープ+クロージャの詳細説明

2. { })();

シンボリックに実行できるのは式のみです。

関数式がシンボリックに実行された後は、関数を再度使用することはできません。

プラス記号、マイナス記号を使用して関数式に変換できます。 、など

+/-/! function test(){

Console.log('a');

}

function test(){
    var arr = [];
    for(var i = 0;i < 10;i ++){
        (function (j){
            arr[j] = function(){
                document.write(j+&#39; &#39;);    
            }
        }(i));
    }
    return arr;
	}
	var myarr = test();
	for(var i = 0;i < 10;i ++){
   	     myarr[i]();
    }

出力結果は: 1 2 3 4 5 6 7 8 9

関連記事:

JavaScriptのスコープとクロージャ

JavaScript のスコープ チェーンとクロージャ

関連ビデオ:

JS 高度なスコープ - Yan Shiba Javascript 高度なビデオ チュートリアル

以上がJavascriptのスコープ+クロージャの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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