簡単で分かりやすいECMA仕様ガイド1 that's this
4248 ワード
簡単で分かりやすいECMA仕様ガイド1
順序
最近SFを混ぜて、偶然にまた仕事の方面に会ってNodeJSの機会があって、切実に他の人にどのようにJSを書くように教える需要があって、私はJSこのものが実はそんなに容易に理解していないことを発見します.
JSに対する自分の理解を深め、是正するために、これからも直接に人の顔を振ることができるように、このような大きな穴を掘り始めました.特別テーマの形式で、ECMA規格に基づいて、Javascriptの各方面をケーブルで紹介したいです.本文はECMA標準の中国語翻訳ではなく、Javascriptの入門教程でもありません.本文はJSのよくある問題で切り込みますが、これらの問題を早く知りたい人には不向きです.本論文の焦点はどのようにJSの各種挙動を決定するかを基準にしています.JSエンジンの水面下で何が起こっていますか?
本論文はECMA 262の5.1版であり、現在最も流行しているものと主流の基準であり、現代のブラウザとNodeJSのデフォルトはこの基準に従っている.英語の原版をベースにして、流暢のために、いくつかの名詞の中国語の翻訳を使うかもしれませんが、マッチする英語の名詞は
Topic 1.that's this
私たちの最初の話題は、thisはどこを指していますか?
何がthisですか
11.1.1 The this Keyword
The this keyword evaluates to the value of the This Binding of the current execution context.
thisキーワードを計算する場合は、現在実行されているコンテキストのThisBindingの値をとります.
10.3 Execution Contectxts
実行コンテキスト
実行文脈には、Lexical Environment、VarabeleEnvironment、ThisBindingの3つの部分が含まれています.この話題の中で、主にThis Bindingに関心を持っています.つまり、コードの中にthisが指す値の結合があります.
グローバルコードのthis
一番簡単なのから
10.4.1 Entering Global Codeはグローバルコードに入る流れの中で、規範は明確に指摘しています.グローバルコード対応の実行文脈において、
Set the This Binding to the global oject.
したがって、グローバルコードでは、thisはグローバルオブジェクトを指します.
関数が式を呼び出すときに提供するthis値
注意:this値
関数が式 refは、関数呼び出しパラメータ左(括弧左側)の式計算の結果 である. フラグは、Identifeier Referenceすなわち変数参照を参照し、ベースを参照すると、環境記録 である.字面量Literal Reference引用baseも環境記録 である.属性アクセスProperty Access orsはポイント演算と である.
非引用タイプのよくあるもの すべてのECMA内蔵関数と全ユーザ定義関数の返却結果(例外的にhost object、つまりDOMなどの宿主オブジェクトが必要であれば、いくつかの関数が参照に戻ります) 環境記録は、前述の実行文脈におけるLexical EvironmentとVarabeleEnvironmentの構成要素である. with文を考慮しないと、環境記録はDeclarative Environment Recordsの一つで、 に戻ります.
以上のように、with文を除外した場合、thisValueはundefinedではなく、属性のみをアクセスする方法です.
this Valueを計算した後、調関数funcの
new表現で提供されるthis値
new表式
Let result be the result of caling the[Call]internal property of F,providing obj as the this value and providing the argment list passed into[Contstruct]as.
Fはコンストラクション関数であり、Objは今回新たに作成したオブジェクトであることがよく分かります.
this値はどのようにThisBindingに変わりますか?
前の2つのセクションでは、2つのトリガ関数の内部コードの方法が、それぞれどのようにしてthis値を構築するかについて説明したが、前述のように、thisキーワードの値は、コンテキスト内のThisBindingによって決定され、this値がThisBindingに変換される過程は、
Let funcCtx be the result of establishing a new execution context for function code using the value of F's[[FormalParameeters]]internal property,the passed args List args,and the this value derisc.
阿哈、第一歩は新しい実行文脈を確立することであり、ここではthisBindingの構築は10.4.3 Entering Function Codeで説明されています. nullとundefinedのthisは、このときグローバルオブジェクト として結びつけられます.他の3つのオブジェクトではないString/Boolean/Numberは、この時点でオブジェクトに変換される しかし、strict modeの下ではどんな変換も行われません.
That's
本節の思考問題: .appyとcallの基準について探してみますが、なぜthisが変わるのですか? .bindに関する基準を探してみます.どこがbindを表しているかを確認した後の関数内のthisは環境や呼び出し方式を無視して、いつも固定値ですか? with文は良い実践ではないので避けましたが、これは読解の標準として練習できます.with文はどのようにthisキーワードに影響しますか?この影響を示すコードを書いてみてください. evalの内部のthisはどのように確定しますか?
順序
最近SFを混ぜて、偶然にまた仕事の方面に会ってNodeJSの機会があって、切実に他の人にどのようにJSを書くように教える需要があって、私はJSこのものが実はそんなに容易に理解していないことを発見します.
JSに対する自分の理解を深め、是正するために、これからも直接に人の顔を振ることができるように、このような大きな穴を掘り始めました.特別テーマの形式で、ECMA規格に基づいて、Javascriptの各方面をケーブルで紹介したいです.本文はECMA標準の中国語翻訳ではなく、Javascriptの入門教程でもありません.本文はJSのよくある問題で切り込みますが、これらの問題を早く知りたい人には不向きです.本論文の焦点はどのようにJSの各種挙動を決定するかを基準にしています.JSエンジンの水面下で何が起こっていますか?
本論文はECMA 262の5.1版であり、現在最も流行しているものと主流の基準であり、現代のブラウザとNodeJSのデフォルトはこの基準に従っている.英語の原版をベースにして、流暢のために、いくつかの名詞の中国語の翻訳を使うかもしれませんが、マッチする英語の名詞は
の中で一回現れます.誤解を避けるために.Topic 1.that's this
私たちの最初の話題は、thisはどこを指していますか?
何がthisですか
11.1.1 The this Keyword
The this keyword evaluates to the value of the This Binding of the current execution context.
thisキーワードを計算する場合は、現在実行されているコンテキストのThisBindingの値をとります.
10.3 Execution Contectxts
実行コンテキスト
Execution Context
は、論理的にスタック構造を形成し、スタックトップ(アクティブ)の実行コンテキストは、現在実行中のコードを追跡する全ての状態を含む.実行文脈には、Lexical Environment、VarabeleEnvironment、ThisBindingの3つの部分が含まれています.この話題の中で、主にThis Bindingに関心を持っています.つまり、コードの中にthisが指す値の結合があります.
グローバルコードのthis
一番簡単なのから
10.4.1 Entering Global Codeはグローバルコードに入る流れの中で、規範は明確に指摘しています.グローバルコード対応の実行文脈において、
Set the This Binding to the global oject.
したがって、グローバルコードでは、thisはグローバルオブジェクトを指します.
関数が式を呼び出すときに提供するthis値
注意:this値
this value
は、thisキーワードとは異なる概念であり、[Call]を呼び出す内部方法のパラメータの一つであり、ユーザコードにおけるthisキーワードとは等しくない.関数が式
CallExpression
を呼び出している間、標準的な説明に従って、this値の疑似コードを計算します.if Type(ref) is
if IsPropertyReference(ref)
thisValue := getBase(ref)
else # assert Type(getBase(ref)) is
thisValue := getBase(ref).ImplicitThisValue()
else
thisValue := undefined
参照タイプがよくある.Environment Record
[]
演算を含み、参照ベースは左値ImplicitThisValue
は常にundefined 以上のように、with文を除外した場合、thisValueはundefinedではなく、属性のみをアクセスする方法です.
this Valueを計算した後、調関数funcの
[[call]]
内部方法を呼び出し、thisの値としてthis Valueを提供する.new表現で提供されるthis値
new表式
NewExpression
の実行過程は、基本的に[[Construct]]
内部の方法に委ねられています.この方法の定義を見て、8番目のステップに注目します.Let result be the result of caling the[Call]internal property of F,providing obj as the this value and providing the argment list passed into[Contstruct]as.
Fはコンストラクション関数であり、Objは今回新たに作成したオブジェクトであることがよく分かります.
this値はどのようにThisBindingに変わりますか?
前の2つのセクションでは、2つのトリガ関数の内部コードの方法が、それぞれどのようにしてthis値を構築するかについて説明したが、前述のように、thisキーワードの値は、コンテキスト内のThisBindingによって決定され、this値がThisBindingに変換される過程は、
[[Call]]
内部方法を呼び出したときに発生する.Let funcCtx be the result of establishing a new execution context for function code using the value of F's[[FormalParameeters]]internal property,the passed args List args,and the this value derisc.
阿哈、第一歩は新しい実行文脈を確立することであり、ここではthisBindingの構築は10.4.3 Entering Function Codeで説明されています.
if function-code is
ThisBinding = thisArg
else if thisArg is null or thisArg is undefined
ThisBinding = global object
else if Type(thisArg) is not
これはマジックの秘密です.That's
this
in Javascript.本節の思考問題: