ホームページ > 記事 > ウェブフロントエンド > フロントエンドの基本的な高度な変数オブジェクトの詳細な説明
年明けから仕事に対する熱意があまり高くなく、最近は無気力な状態が続いております。朝起きたくない、起きても仕事に行きたくない。当然、休暇前も私の仕事への熱意は非常に高く、小さなプログラムのプロジェクトについて考えていましたが、休暇から戻った後の私の仕事のスタイルはまったく異なりました。重度のホリデー後症候群にかかっているような気がします。幸いなことに、今週は完全に無駄ではなかったことを示すためにいくつかの記事を書きました。この記事では、変数オブジェクトについて紹介します。 JavaScript では必然的に変数や関数を宣言する必要がありますが、JS パーサーはどのようにしてこれらの変数を見つけるのでしょうか?また、実行コンテキストについてさらに理解する必要があります。 前回の記事では、関数が呼び出される (アクティブ化される) と、新しい実行コンテキストが作成されることをすでに知っていました。実行コンテキストのライフサイクルは 2 つの段階に分けることができます。
作成フェーズ
このフェーズでは、実行コンテキストは変数オブジェクトを作成し、スコープチェーンを確立し、この
コード実行フェーズ
のポイントを決定します。作成が完了すると、コードが開始されますを実行すると、この時点で変数の代入や関数の参照などのコードの実行が完了します。
ここから、実行コンテキストには変数オブジェクト、スコープチェーン、thisなどが含まれるため、実行コンテキストを詳細に理解することが非常に重要であることがわかります。多くの人は理解していませんこれは非常に重要な概念なので、JavaScript を本当に理解できるかどうかに関係します。以下の記事で 1 つずつ詳しくまとめます。ここでは、まず変数オブジェクトを理解することに焦点を当てます。
変数オブジェクトの作成は、以下のプロセスを順に経ていきます。
引数オブジェクトを作成します。現在のコンテキストのパラメータを確認し、オブジェクトの下に属性と属性値を確立します。
現在のコンテキストの関数宣言、つまり function キーワードを使用して宣言された関数を確認します。変数オブジェクトに関数名を含む属性を作成します。属性値は、関数が配置されているメモリ アドレスへの参照です。関数名属性がすでに存在する場合、その属性は新しい参照によって上書きされます。
現在のコンテキストで変数宣言を確認し、変数宣言が見つかった場合は、変数オブジェクト内にその変数名を持つ属性を作成します。属性値は未定義です。変数名の属性が既に存在する場合、同名の関数が未定義に変更されるのを防ぐため、そのままスキップされ、元の属性値は変更されません。
このルールによれば、変数のプロモーションを理解するのが非常に簡単になります。変数プロモーションについては多くの記事で言及されていますが、多くの人は実際にはそれが何であるかを実際には理解できません。将来的には、変数オブジェクトの作成プロセスを使用して、面接中に変数プロモーションを面接官に説明し、即座に改善できるようにします。
上記のルールでは、関数宣言が var 宣言よりも高い優先順位を持っていることがわかります。誰もが変数オブジェクトをよりよく理解できるように、いくつかの簡単な例を使用して変数オブジェクトについて説明します。
// demo01function test() {console.log(a);console.log(foo());var a = 1;function foo() {return 2; } } test();
上記の例では、test() の実行コンテキストから直接理解し始めます。 test()
をグローバル スコープで実行すると、test() の実行コンテキストが作成され始めます。理解を容易にするために、次の形式を使用して表現します
创建过程 testEC = {// 变量对象 VO: {}, scopeChain: {}, this: {} }// 因为本文暂时不详细解释作用域链和this,所以把变量对象专门提出来说明// VO 为 Variable Object的缩写,即变量对象 VO = { arguments: {...}, //注:在浏览器的展示中,函数的参数可能并不是放在arguments对象中,这里为了方便理解,我做了这样的处理 foo: <foo reference> // 表示foo的地址引用 a: undefined }
実行フェーズに入る前は、変数オブジェクト内の属性にアクセスできません。ただし、実行フェーズに入ると、変数オブジェクトはアクティブ オブジェクトに変換され、内部のプロパティにアクセスできるようになり、実行フェーズの操作が開始されます。
このように、インタビュー中に変数オブジェクトとアクティブオブジェクトの違いについて質問された場合、実際には同じオブジェクトですが、実行コンテキストのライフサイクルが異なりますので、自由に答えることができます。
// 执行阶段VO -> AO // Active ObjectAO = { arguments: {...}, foo: <foo reference>, a: 1 }
つまり、上記の例demo1では、実行シーケンスは次のようになります
function test() {function foo() {return 2; }var a;console.log(a);console.log(foo()); a = 1; } test();
理解を定着させるために別の例を見てみましょう。
// demo2function test() {console.log(foo);console.log(bar);var foo = 'Hello';console.log(foo);var bar = function () {return 'world'; }function foo() {return 'hello'; } } test();rreerreeee
上記の知識を組み合わせて、この例の作成段階から実行段階までの変数オブジェクトの変更を注意深く比較する必要があります。すでに理解している場合は、変数オブジェクトに関連するすべてのことはもう難しくないことを意味します。あなたのために。
ブラウザを例に挙げると、グローバルオブジェクトはウィンドウです。
グローバル コンテキストには特別な場所があり、その変数オブジェクトはウィンドウ オブジェクトです。この特集は窓にも当てはまります。
// 创建阶段VO = { arguments: {...}, foo: <foo reference>, bar: undefined } // 这里有一个需要注意的地方,因为var声明的变量当遇到同名的属性时,会跳过而不会覆盖
さらに、グローバル コンテキストのライフ サイクルは、プログラムのライフ サイクルと一致します。ブラウザ ウィンドウを閉じるなど、プログラムが終了しない限り、グローバル コンテキストは常に存在します。他のすべてのコンテキストは、グローバル コンテキストのプロパティに直接アクセスできます。
以上がフロントエンドの基本的な高度な変数オブジェクトの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。