ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScriptの基礎知識まとめ (9) スコープとスコープチェーンの絶妙な解説

JavaScriptの基礎知識まとめ (9) スコープとスコープチェーンの絶妙な解説

php中世界最好的语言
php中世界最好的语言オリジナル
2018-03-10 13:36:321416ブラウズ

今回は JavaScript の基礎知識まとめをお届けします。

スコープの詳細

[[scope]]: すべての JavaScript 関数はオブジェクトです。オブジェクト内の一部のプロパティにはアクセスできますが、一部のプロパティにはアクセスできません。これらのプロパティは JavaScript エンジンからのみアクセス可能であり、[[scope]] もその 1 つです。

[[scope]] は実行時コンテキストのコレクションを保存するスコープと呼ばれるものを指します

スコープ チェーン: [[scope]] に保存される実行コンテキスト オブジェクトのコレクション、このコレクションはチェーン タイプ リンクです。このチェーンリンクスコープチェーンを呼び出します

実行コンテキスト: 関数が実行されると、実行コンテキストと呼ばれる内部オブジェクトが作成されます。実行コンテキストは、関数が実行されるときの環境を定義します。対応する実行コンテキストは関数が実行されるたびに一意であるため、関数を複数回呼び出すと、関数の実行が完了すると複数の実行コンテキストが作成されます。実行コンテキストは破棄されます

変数を検索します: スコープ チェーンの先頭から下方向に検索します

function a() {    function b(){        var b = 234;
    }    
    var a = 123;
    b();
}var glob = 100;
a();

まず、上の関数を見てみましょう。これは全体的な関数であり、a はグローバル スコープ内にあり、次にこの変数の下に glob があります。次に、この a を使用して実行されます。

ステップ 1: まず、システムが認識するのは、a が定義されている場合、この [[スコープ]] を持つことになります。この Position 0 は GO を指します


Activation Object

0 はこのテーブルを指します

a
/
[[scope]]    
scope指向scope chain
scope chain
scope指向这里

1 はこのテーブルを指します

this    window    
window    (object)    
document    (object)    
a    (function)    
glob    100    
[[scope]]里面有这个全局的执行期上下文,然后a被执行了,a被执行,a产生的这个AO,把自己的AO存到作用域链的最顶端,形成一个新的作用域链,现在的a的[[scope]]和刚才的那个[[scope]]不一样了
a
/
[[scope]]
scope指向scope chain
scope chain
scope指向这里

ただ違うだけで、そこに格納されている値が [[scope]] またはその [[scope]] については、現時点では次のことは見ていません。この時点で変数にアクセスすると、a の [[scope]] にアクセスし、a の [[scope]] から情報を取得します。 . A のスコープは倉庫であり、このライブラリにスコープ チェーンが格納されており、何かを取得しに行くときにその上と下を見ます。

すると、a の実行により b の定義が得られます。A は b の実行後にのみ定義できます。b が定義されると、自然な [[scope]] が存在し、[[scope]] にはそれが持つべきものが格納されます。スコープ チェーンですが、そのスコープ チェーンは a のスコープ チェーンとは異なります。 a が定義されている場合、それはグローバルにあり、アクセスできる唯一の属性は独自の AO とグローバル GO ですが、b は a に定義されています。関数なので、b の [[scope]] は自身の AO だけでなく a の AO にもアクセスでき、グローバル GO

this    window    
arguents    []    
a    123    
b    (function)    
Global Object

スコープはスコープチェーン

スコープチェーン


スコープを指します

0 この位置の 0 は自分の AO を指します

1 この位置の 1 は自分の AO を指します

2 この位置の 0 は GO を指します

アクティベーションオブジェクト

0 ポイントto このテーブルです

this    window    
window    (object)    
document    (object)    
a    (function)    
glob    100

1 はこのテーブルを指します

b
/
[[scope]]

1 はこのテーブルを指します

this    window    
arguents    []    
b    234;    
Activation  Object

スコープ破棄

bが実行されると、自分のaoを破棄し、定義状態に戻り、次の実行を待ちます

bは関数aの最後の文なので、bが実行されるとaも破棄され、bの[[scope]]も破棄されて定義状態に戻り、次回実行されるのを待ちます

this    window    
arguents    []    
a    123    
b    (function)    
Global Object

ということで外部関数は

内部関数


のプロパティと値にアクセスできません。この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、PHP 中国語 Web サイトの他の関連記事に注目してください。

関連書籍:

JavaScriptの基礎知識まとめ(6) 関数、初期スコープ(その2)

JavaScriptの基礎知識まとめ(7) 再帰

JavaScriptの基礎知識まとめ(8)プリコンパイルの実行プロセス

以上がJavaScriptの基礎知識まとめ (9) スコープとスコープチェーンの絶妙な解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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