Javascriptのクロヌゞャヌ[パヌト1]

リチャヌドコヌンフォヌドJavascript Closuresによる翻蚳。





はじめに



短絡

クロヌゞャヌは、自由倉数を持぀こずができる匏通垞は関数であり、これらの倉数をバむンドする環境぀たり、この匏を閉じるを持぀こずができたす。


クロヌゞャヌはECMAScriptjavascriptの最も匷力な機胜の1぀ですが、理解なくしお適切に適甚するこずはできたせん。 偶然でも簡単に䜜成できるずいう事実にもかかわらず、特に比范的䞀般的なブラりザ環境では、䜜成が有害な結果をもたらす可胜性がありたす。 障害ずの偶発的な衝突を避け、障害を利甚するには、そのメカニズムを理解する必芁がありたす。 これは、識別子の解決におけるスコヌプチェヌンの圹割ず、オブゞェクトのプロパティ名の解決に倧きく䟝存したす。



クロヌゞャヌの最も簡単な説明は、ECMAScriptが他の関数の本䜓内にネストされた関数、関数定矩、および関数匏を蚱可するずいうこずです。 たた、これらのネストされた関数は、倖郚関数倖郚関数内のすべおのロヌカル倉数、パラメヌタヌ、および関数にアクセスできたす。 これらのネストされた関数の1぀が含たれおいた関数の倖郚で䜿甚可胜になるず、クロヌゞャヌが圢成されるため、倖郚関数の完了埌に実行できたす。 この時点で、圌女はただロヌカル倉数、パラメヌタヌ、および倖郚関数の内郚関数宣蚀にアクセスできたす。 これらのロヌカル倉数、パラメヌタヌ、および関数宣蚀は最初は倖郚関数が完了したずきず同じ倀を持ち、内郚関数ず察話できたす。



残念ながら、クロヌゞャヌを適切に理解するには、クロヌゞャヌの背埌にあるメカニズムを理解し、倚くの技術的な詳现を知る必芁がありたす。 以䞋の説明の冒頭でECMA 262で定矩されおいるアルゎリズムの䞀郚に぀いお説明しおいたすが、ほずんどのアルゎリズムを省略したり、単玔化しお単玔化したりするこずはできたせん。 オブゞェクトのプロパティ名の解決に粟通しおいる堎合は、このセクションをスキップできたすが、クロヌゞャヌに既に粟通しおいる人だけが埌続のセクションをスキップし、今すぐ読むのをやめおそれらの䜿甚に戻るこずができたす。



オブゞェクトプロパティの名前解決



ECMAScriptは、ネむティブオブゞェクトずホストオブゞェクト、および組み蟌みオブゞェクトず呌ばれるネむティブオブゞェクトのサブカテゎリの2぀のカテゎリのオブゞェクトを認識したすECMA 262 3rd Ed Section 4.3。 ネむティブオブゞェクトは蚀語に属し、ホストオブゞェクトは環境によっお提䟛され、たずえばドキュメントオブゞェクト、DOMノヌドなどになりたす。



ネむティブオブゞェクトは、名前付きプロパティの無料の動的コンテナです䞀郚の実装は、埋め蟌みオブゞェクトのサブカテゎリになるずそれほど動的ではありたせんが、通垞は重芁ではありたせん。 ネむティブオブゞェクトの特定の名前付きプロパティは、別のオブゞェクトこの意味では関数でもありたすぞの参照ずなる倀、たたは基本倀、String、Number、Boolean、Null、たたはUndefinedを栌玍したす。 プリミティブ型Undefinedは、オブゞェクトのプロパティをundefinedに蚭定できるずいう意味で少し珍しいですが、プロパティはオブゞェクトから削陀されたせん。 オブゞェクトの名前付きプロパティのたたであり、倀undefinedを単に栌玍したす。



以䞋は、オブゞェクトのプロパティがどのように読み取られお蚭定され、内郚の詳现に可胜な限り圱響を䞎えるかに぀いおの簡単な説明です。



倀の割り圓お



オブゞェクトの名前付きプロパティを䜜成するか、既存の名前付きプロパティの倀を蚭定するには、名前付きプロパティに倀を割り圓おたす。

このように

var objectRef = new Object(); //   (generic)  javascript.
      
      





「testNumber」ずいう名前のプロパティは、次のように䜜成できたす。

 objectRef.testNumber = 5; /*  */ objectRef["testNumber"] = 5;
      
      





オブゞェクトには、倀を割り圓おる前にtestNumberプロパティがありたせんでしたが、 埌で䜜成されたした。 以降の割り圓おでは、このプロパティを䜜成する必芁はありたせん。倀を倉曎するだけです。

 objectRef.testNumber = 8; /*  */ objectRef["testNumber"] = 8;
      
      





Javascriptオブゞェクトには、以䞋で簡単に説明するように、それ自䜓がオブゞェクトになる可胜性のあるプロトタむプがあり、これらのプロトタむプには名前付きプロパティを含めるこずができたす。 ただし、これは割り圓おには適甚されたせん。 倀が割り圓おられ、オブゞェクトに察応する名前のプロパティがない堎合、このプロパティが䜜成され、倀が割り圓おられたす。 オブゞェクトにそのようなプロパティがある堎合、その倀はリセットされたす。



倀の読み取り



オブゞェクトのプロトタむプが䜿甚されるのは、倀を読み取るずきです。 オブゞェクトにプロパティアクセサヌ匏で䜿甚される名前のプロパティがある堎合、このプロパティの倀が返されたす

 /*    .           ,     */ objectRef.testNumber = 8; /*     */ var val = objectRef.testNumber; /*  val    8,        . */
      
      





しかし、すべおのオブゞェクトはプロトタむプを持぀こずができ、プロトタむプはオブゞェクトであり、プロトタむプを持぀こずができるプロトタむプなどを持぀こずができ、プロトタむプチェヌンず呌ばれるものを圢成したす。 プロトタむプチェヌンは、チェヌン内のオブゞェクトの1぀にnullプロトタむプがあるず終了したす 。 Objectコンストラクタヌでデフォルトで䜿甚されるプロトタむプには、 nullプロトタむプがあるため、

 var objectRef = new Object(); //   (generic)  javascript
      
      





プロトタむプObject.prototypeを䜿甚しおオブゞェクトを䜜成したす。それ自䜓はnullプロトタむプを持ちたす 。 次に、 objectRefオブゞェクトのプロトタむプチェヌンには、 Object.prototypeずいう 1぀のオブゞェクトのみが含たれたす。 しかし

 /*  “”     MyObject1.*/ function MyObject1(formalParameter){ /*    testNumber    ,  ,     */ this.testNumber = formalParameter; } /*  “”     MyObject2 */ function MyObject2(formalParameter){ /*  testString      ,  ,     */ this.testString = formalParameter; } /*   ,   ,      MyObject2,   MyObject1,   8   MyObject1,     testNumber     */ MyObject2.prototype = new MyObject1( 8 ); /*,    MyObject2    objectRef    ,        */ var objectRef = new MyObject2( "String_Value" );
      
      





倉数objectRefによっお参照されるMyObject2のむンスタンスには、プロトタむプチェヌンがありたす。 このチェヌンの最初のオブゞェクトはMyObject1のむンスタンスで、䜜成され、 MyObject2コンストラクタヌのprototypeプロパティに割り圓おられおいたす 。 MyObject1のむンスタンスには、デフォルトでMyObject1のprototypeプロパティに割り圓おられたプロトタむプオブゞェクトがありたす。 このプロトタむプはObjectのデフォルトのプロトタむプです。 Object.prototypeによっお参照されるオブゞェクト。 Object.prototypeにはnullプロトタむプがあるため、チェヌンはこの時点で終了したす。



プロパティアクセス匏がobjectRefによっお参照されるオブゞェクトから名前付きプロパティを読み取ろうずするず、プロトタむプチェヌン党䜓がプロセスに参加できたす。 単玔な堎合

 var val = objectRef.testString;
      
      





-objectRefを介しおアクセス可胜なMyObject2のむンスタンスにはtestStringずいうプロパティがあるため、このプロパティの倀はString_Valueに蚭定され、倉数valに割り圓おられたす。

しかし

 var val = objectRef.testNumber;
      
      





MyObject2関数のむンスタンスからプロパティを読み取るこずができないため、 そのようなプロパティはありたせんが、倉数valは 8に蚭定され、 undefinedではありたせん。これは、オブゞェクト自䜓の察応する名前付きプロパティの怜玢が倱敗したため、むンタプリタがそのプロトタむプであるオブゞェクトをチェックするためです そのプロトタむプは、このプロパティに倀8が割り圓おられたtestNumberプロパティで䜜成された関数MyObject1のむンスタンスであるため、プロパティぞのアクセスの匏は倀8ずしお蚈算されたす。 MyObject1もMyObject2もtoStringメ゜ッドを定矩したせんが、プロパティアクセス匏がobjectRefからtoStringプロパティの倀を読み取ろうずするず、

 var val = objectRef.toString;
      
      





次に、 val倉数に関数参照が割り圓おられたす。 この関数はObject.prototypeオブゞェクトのtoStringプロパティであり、プロトタむプ怜蚌プロセスの結果ずしお返されたす objectRefオブゞェクトがチェックされ 、その䞭にtoStringプロパティが欠萜した埌、 objectRefプロトタむプがチェックされ 、このプロパティがないこずが刀明するずそのプロトタむプはテスト䞭です。 そのプロトタむプはObject.prototypeで、 toStringメ゜ッドがあり、リンクはこの関数に戻りたす。



結論ずしお

 var val = objectRef.madeUpProperty;
      
      





-プロトタむプチェヌンを凊理するプロセスがどのオブゞェクトにもmadeUpPropertyずいう名前のプロパティを芋぀けられないため、 undefinedを返し、最終的にObject.prototypeオブゞェクトのプロトタむプに到達したす。 nullの堎合、 undefinedを返すこずでプロセスが終了したす。



名前付きプロパティを読み取るず、オブゞェクトたたはそのプロトタむプチェヌンから最初に芋぀かった倀が返されたす。 察応するプロパティが存圚しない堎合、オブゞェクトの名前付きプロパティに倀を割り圓おるず、オブゞェクト自䜓にプロパティが䜜成されたす。



これは、倀がobjectRef.testNumber = 3に割り圓おられた堎合、 testNumberプロパティがMyObject2関数のむンスタンスで䜜成され、その埌倀を読み取ろうずするず、オブゞェクトに蚭定された倀が返されるこずを意味したす。 これで、プロパティのアクセス匏を実行するためにプロトタむプチェヌンは䞍芁になりたしたが、 testNumberプロパティに倀8が割り圓おられたMyObject1のむンスタンスは倉曎されおいたせん。 objectRefオブゞェクトに倀を割り圓おるず、そのプロトタむプチェヌン内の察応するプロパティが単玔に非衚瀺になりたす。



ECMAScript が内郚型Objectの内郚プロパティ[[prototype]]を定矩しおいるこずに泚意しおください。 このプロパティはスクリプトから盎接アクセスできたせんが、アクセスプロパティ匏を解決するために䜿甚される内郚[[prototype]]プロパティによっお参照されるオブゞェクトのチェヌンがありたす。 このチェヌンは、オブゞェクトのプロトタむプチェヌンです。 パブリックプロトタむププロパティは、内郚[[prototype]]プロパティず共に、倀の割り圓お、プロトタむプの定矩、および操䜜のために存圚したす。 蜂蜜のこれら2぀の特性間の関係の詳现はECMA 262第3版で説明されおおり、この説明には含たれおいたせん。



識別子の名前解決、実行コンテキスト、およびスコヌプチェヌン



実行コンテキスト



実行コンテキストは、ECMAScript実装ECMA 262第3版で䜿甚される抜象抂念で、ECMAScript実装に必芁な動䜜を決定したす。 仕様には、 実行コンテキストの実装方法に぀いおは䜕も蚘茉されおいたせんが、 実行コンテキストには、仕様で定矩された構造を参照する関連属性があるため、閉じられおいおも、プロパティを持぀オブゞェクトずしお構想たたは実装するこずができたす。



すべおのjavascriptコヌドは、実行コンテキストで実行されたす 。 グロヌバルコヌドhtmlペヌゞたたはJSファむルに埋め蟌たれたコヌド、たたはペヌゞのロヌドロヌド埌に実行されるコヌドはグロヌバル実行コンテキストで実行され、各関数呌び出しおそらくコンストラクタヌずしおには察応する実行コンテキストがありたす。 eval関数を䜿甚しお実行されるコヌドも特定の実行コンテキストを取埗したすが、 evalはjavascriptプログラマヌによっお䞀般的に䜿甚されないため、ここでは説明したせん。 実行コンテキストの指定された詳现は、ECMA 262第3版のセクション10.2にありたす。



javascript関数が呌び出されるず、 実行コンテキストが远加されたす 。別の関数が呌び出されるずたたは同じ関数が再垰的に、新しい実行コンテキストが䜜成され、実行プロセスは関数呌び出し䞭にこのコンテキストを远加したす。 呌び出された関数が完了するず、元の実行コンテキストが返されたす。 したがっお、実行するJavaScriptコヌドは、 実行コンテキストのスタックを圢成したす。



実行コンテキストが䜜成されるず、特定の順序でいく぀かのこずが起こりたす。 最初に、 実行のコンテキストで 、Activationオブゞェクトが䜜成されたす。 アクティベヌションオブゞェクトは、仕様の別のメカニズムです。 結果ずしおアクセス可胜な名前付きプロパティがあるため、オブゞェクトず芋なすこずができたすが、通垞のオブゞェクトではありたせん。 プロトタむプがありたせん少なくずもプロトタむプは定矩されおいたせん。javascriptコヌドには、リンクがありたせん。



関数を呌び出すための実行コンテキストを䜜成する次のステップは、 匕数オブゞェクトを䜜成するこずです。これは、この順序で関数に送信される匕数に察応する敎数でむンデックス付けされた芁玠を持぀配列のようなオブゞェクトです。 たた、プロパティlengthずcalleeがありたすこれは説明に関係ありたせん。詳现は仕様にありたす。 アクティベヌションオブゞェクトのプロパティは、 匕数argumentsぞの参照が割り圓おられたargumentsずいう名前で䜜成されたす。



次に、実行コンテキストが scopeを割り圓おたす 。 スコヌプは、オブゞェクトのリストたたはチェヌンで構成されたす。 各関数オブゞェクトには内郚[[scope]]プロパティがありこれに぀いおは埌で詳しく説明したす、これもオブゞェクトのリストたたはチェヌンで構成されおいたす。 関数呌び出しの実行コンテキストに割り圓おられるスコヌプは、察応する関数オブゞェクトの[[scope]]プロパティによっお参照されるリストず、チェヌンの最䞊郚たたはこのリストの最䞊郚に远加されたアクティベヌションオブゞェクトで構成されたす。



次に、ECMA 262で倉数のオブゞェクト倉数オブゞェクトずしお定矩されおいるオブゞェクトを䜿甚しお、倉数を䜜成するプロセス倉数のむンスタンス化が発生したす。 同時に、アクティベヌションオブゞェクトは倉数のオブゞェクトずしお䜿甚されたすこれは同じオブゞェクトであり、これは重芁です。 倉数オブゞェクトの名前付きプロパティは、関数の各仮パラメヌタヌに察しお䜜成され、関数を呌び出すずきの匕数がこれらのパラメヌタヌに察応する堎合、匕数はこれらのプロパティに割り圓おられたすそうでない堎合はundefined 。 内郚関数の定矩は、関数宣蚀で䜿甚される関数の名前に察応する名前を持぀倉数のオブゞェクトプロパティに割り圓おられた関数オブゞェクトを䜜成するために䜿甚されたす。 倉数を䜜成する最埌の手順は、関数内で定矩されたすべおのロヌカル倉数に察応する倉数オブゞェクトの名前付きプロパティを䜜成するこずです。



宣蚀されたロヌカル倉数に察応する倉数オブゞェクトで䜜成されたプロパティは、倉数の䜜成䞭に最初に未定矩の倀を取埗したす。ロヌカル倉数は、関数本䜓コヌドの実行䞭に察応する割り圓お操䜜が実行されるたで初期化されたせん。



実際、関数のロヌカル倉数に察応するargumentsプロパティを持぀アクティベヌションオブゞェクトず名前付きプロパティを持぀倉数オブゞェクトは、識別子の匕数を関数のロヌカル倉数ず芋なすこずができる同じオブゞェクトです。



結論ずしお、thisキヌワヌドで䜿甚される倀が割り圓おられたす。 この倀がオブゞェクトを参照する堎合、 この接頭蟞が付いたプロパティアクセス匏はこのオブゞェクトのプロパティを参照したす。 この倀関数内で割り圓おられるがnullの堎合、 これはグロヌバルオブゞェクトを参照したす。



グロヌバル実行コンテキストの凊理はわずかに異なり、匕数がないため、参照するアクティベヌションオブゞェクトを定矩する必芁はありたせん。 グロヌバル実行コンテキストにはスコヌプが必芁であり、そのチェヌンにはグロヌバルオブゞェクトずいう1぀のオブゞェクトのみが含たれたす。 グロヌバル実行コンテキストは倉数の䜜成を通過し、その内郚関数は通垞のトップレベルの宣蚀関数であり、ほずんどのJavaScriptコヌドを構成したす。 グロヌバルオブゞェクトは倉数のオブゞェクトずしお䜿甚されるため、グロヌバルに宣蚀された関数はグロヌバルオブゞェクトのプロパティになりたす。 グロヌバルに宣蚀された倉数に぀いおも同じです。



グロヌバル実行コンテキストは、 thisの倀ずしおグロヌバルオブゞェクトぞの参照も䜿甚したす。



スコヌプチェヌンず[[scope]]プロパティ



関数呌び出しの実行コンテキストのスコヌプチェヌンは、関数オブゞェクトの[[scope]]プロパティに含たれるスコヌプチェヌンの先頭にアクティベヌションオブゞェクト倉数オブゞェクトを远加するこずによっお組み立おられたす。したがっお、内郚[[scope]]プロパティの定矩方法を理解するこずが重芁です。



ECMAScriptでは、関数はオブゞェクトであり、関数宣蚀から倉数を䜜成するずき、匏関数関数匏を実行するずき、たたはFunctionコンストラクタヌが呌び出されるずきに䜜成されたす。



Functionコンストラクタヌによっお䜜成された関数オブゞェクトには、垞に[[scope]]プロパティがありたす。これは、グロヌバルオブゞェクトのみを含むスコヌプチェヌンを参照したす。



関数宣蚀たたは関数匏によっお䜜成された関数オブゞェクトには、それらが䜜成される実行コンテキストのスコヌプがあり、内郚[[scope]]プロパティに割り圓おられたす。



次のようなグロヌバル関数宣蚀の最も単玔な堎合

 function exampleFunction(formalParameter){ ... //    }
      
      





察応する関数オブゞェクトは、グロヌバル実行コンテキストの倉数の䜜成䞭に䜜成されたす。 グロヌバル実行コンテキストには、グロヌバルオブゞェクトのみで構成されるスコヌプがありたす。



したがっお、グロヌバルオブゞェクトexampleFunctionのプロパティによっお参照されるこの䜜成された関数オブゞェクトには、グロヌバルオブゞェクトのみを含むスコヌプチェヌンを参照する内郚プロパティ[[scope]]が割り圓おられたす。



グロヌバルコンテキストでの匏関数の実行䞭に、同様のスコヌプチェヌンが割り圓おられたす。

 var exampleFuncRef = function(){ ... //    }
      
      





ただし、この堎合、グロヌバルオブゞェクトの名前付きプロパティは、グロヌバル実行コンテキストの倉数の䜜成䞭に䜜成されたすが、関数オブゞェクトは䜜成されず、割り圓お匏が実行されるたで、グロヌバルオブゞェクトの名前付きプロパティにその参照が割り圓おられたせん。 ただし、関数の䜜成は匕き続きグロヌバル実行コンテキストで行われるため、䜜成された関数オブゞェクトの[[scope]]プロパティには、割り圓おられたスコヌプチェヌンのグロヌバルオブゞェクトのみが含たれたす。



関数ず匏関数の内郚宣蚀により、関数実行のコンテキスト内で䜜成される関数オブゞェクトが䜜成されるため、スコヌプのより耇雑なチェヌンが取埗されたす 。 内郚関数の宣蚀で関数を定矩し、倖郚関数を実行する以䞋のコヌドを怜蚎しおください

 function exampleOuterFunction(formalParameter){ function exampleInnerFuncitonDec(){ ... //    } ... //      } exampleOuterFunction( 5 );
      
      





倖郚関数の宣蚀に察応する関数オブゞェクトは、グロヌバル実行コンテキストでの倉数の䜜成䞭に䜜成されるため、その[[scope]]プロパティには、1぀のグロヌバルオブゞェクトで構成されるスコヌプ チェヌンが含たれたす。



グロヌバルコヌドがexampleOuterFunction呌び出しを行うず、アクティベヌションオブゞェクト倉数オブゞェクトずずもに、この関数呌び出しの新しい実行コンテキストが䜜成されたす。 新しい実行コンテキストのスコヌプは、新しいアクティベヌションオブゞェクトず、それに続く倖郚関数の[[scope]]プロパティが参照するチェヌングロヌバルオブゞェクトのみで構成されるチェヌンになりたす。 新しい実行コンテキストの倉数を䜜成するプロセスにより、内郚関数の宣蚀に察応する関数オブゞェクトが䜜成されたす。この内郚関数の[[scope]]プロパティには、䜜成された実行コンテキストのスコヌプの倀が割り圓おられたす。 スコヌプチェヌンには、アクティベヌションオブゞェクトずそれに続くグロヌバルオブゞェクトが含たれたす。



この時点たで、すべおは゜ヌスコヌドの構造ず実行によっお自動的に実行および制埡されたす。 実行コンテキストのスコヌプのチェヌンは 、䜜成された関数オブゞェクトの[[scope]]プロパティを定矩し、 [[scope]]関数オブゞェクトのこれらのプロパティは察応するアクティベヌションオブゞェクトず共に実行コンテキストのスコヌプを決定したす。 ただし、ECMAScriptは、スコヌプを倉曎する手段ずしおwithステヌトメントをサポヌトしおいたす。



withステヌトメントは匏を評䟡し、それがオブゞェクトである堎合、珟圚の実行コンテキストのスコヌプに远加されたすアクティベヌションオブゞェクト/倉数の盎前。 次に、withは別の匏ブロックの堎合もある を評䟡し、実行コンテキストのスコヌプチェヌンを元の圢匏に埩元したす 。



関数オブゞェクトの䜜成は倉数の䜜成䞭に行われるため、 withステヌトメントは関数の宣蚀に圱響したせんが、匏関数はwithステヌトメント内で実行できたす

 /*    y,     */ var y = {x:5}; //     x function exampleFuncWith(){ var z; /*  ,     y,      */ with(y){ /*  -,    ,          z */ z = function(){ ... //   -; } } ... } /*   exampleFuncWith */ exampleFuncWith();
      
      





exampleFuncWithが呌び出されるず 、その実行コンテキストには、この関数のアクティベヌションオブゞェクトず次のグロヌバルオブゞェクトで構成されるスコヌプチェヌンがありたす。 withステヌトメントを実行するず 、この匏関数の実行䞭、グロヌバル倉数yによっお参照されるオブゞェクトがこのスコヌプチェヌンの先頭に远加されたす。匏関数の実行によっお䜜成された[[scope]]関数オブゞェクトのプロパティには、このオブゞェクトが䜜成された実行コンテキストのスコヌプに察応する倀が割り圓おられたす。スコヌプは、オブゞェクトyず、それに続く倖郚関数の実行のコンテキストからのアクティベヌションオブゞェクト、グロヌバルオブゞェクトから構成されたす。with



ステヌトメントのblockステヌトメントが完了するず、実行コンテキストのスコヌプが埩元されたすyオブゞェクトは削陀されたすが、その時点で関数オブゞェクトが䜜成され、その[[scope]]プロパティにスコヌプチェヌンぞのリンクが割り圓おられたしたオブゞェクトyが䞊郚にありたす。



識別子の名前解決



識別子は、スコヌプのチェヌンを通じお怜玢されたす。ECMA 262は、これを識別子ではなくキヌワヌドずしお定矩したすが、これは䞍合理ではありたせん。スコヌプのチェヌンに頌るこずなく、それが䜿甚される実行のコンテキストにあるthisの倀に応じお決定されたす。



識別子名解決は、スコヌプチェヌンの最初のオブゞェクトから始たりたす。プロセスは、識別子に察応する名前のプロパティがあるかどうかを確認したす。事実のためのスコヌプの連鎖オブゞェクトのチェヌンである堎合、このテストはこのオブゞェクトのプロトタむプのチェヌン存圚する堎合をカバヌしたす。察応する倀がスコヌプチェヌンの最初のオブゞェクトで芋぀からない堎合、怜玢は次のオブゞェクトで続行されたす。そしお、識別子に察応する名前を持぀プロパティがチェヌンのオブゞェクトの1぀たたはそのプロトタむプの1぀で芋぀かるたで、たたは可芖領域のチェヌンが終了するたで続きたす。



識別子に察する操䜜は、前述のように、オブゞェクトのプロパティにアクセスするための匏が䜿甚されるのず同じ方法で発生したす。スコヌプチェヌンで識別されるオブゞェクト察応するプロパティを持぀ように、プロパティぞのアクセスの匏でオブゞェクトの堎所を取り、識別子はこのオブゞェクトのプロパティの名前ずしお機胜したす。グロヌバルオブゞェクトは垞にスコヌプチェヌンの最埌にありたす。



関数呌び出しの実行コンテキストにはチェヌンの先頭にアクティベヌションオブゞェクト倉数オブゞェクトが含たれおいるため、関数本䜓で䜿甚される識別子は、最初にそれらが正匏なパラメヌタヌ、内郚関数宣蚀の名前、たたはロヌカル倉数に察応するかどうかを確認したす。これらは、アクティベヌションオブゞェクト倉数オブゞェクトの名前付きプロパティずしお蚈算されたす。



翻蚳にはリュドミラ・リホビッドも含たれおいたした。



JavaScriptのクロヌゞャヌ[パヌト2]



All Articles