簡単で分かりやすい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
実行コンテキスト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
  • refは、関数呼び出しパラメータ左(括弧左側)の式計算の結果
  • である.
  • 参照タイプがよくある.
  • フラグは、Identifeier Referenceすなわち変数参照を参照し、ベースを参照すると、環境記録Environment Record
  • である.
  • 字面量Literal Reference引用baseも環境記録
  • である.
  • 属性アクセスProperty Access orsはポイント演算と[]演算を含み、参照ベースは左値
  • である.
  • 非引用タイプのよくあるもの
  • すべてのECMA内蔵関数と全ユーザ定義関数の返却結果(例外的にhost object、つまりDOMなどの宿主オブジェクトが必要であれば、いくつかの関数が参照に戻ります)
  • 環境記録は、前述の実行文脈におけるLexical EvironmentとVarabeleEnvironmentの構成要素である.
  • with文を考慮しないと、環境記録はDeclarative Environment Recordsの一つで、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 
        ThisBinding = ToObject(thisArg)
    else
        ThisBinding = thisArg
    
    これはマジックの秘密です.
  • nullとundefinedのthisは、このときグローバルオブジェクト
  • として結びつけられます.
  • 他の3つのオブジェクトではないString/Boolean/Numberは、この時点でオブジェクトに変換される
  • しかし、strict modeの下ではどんな変換も行われません.
    That's this in Javascript.
    本節の思考問題:
  • .appyとcallの基準について探してみますが、なぜthisが変わるのですか?
  • .bindに関する基準を探してみます.どこがbindを表しているかを確認した後の関数内のthisは環境や呼び出し方式を無視して、いつも固定値ですか?
  • with文は良い実践ではないので避けましたが、これは読解の標準として練習できます.with文はどのようにthisキーワードに影響しますか?この影響を示すコードを書いてみてください.
  • evalの内部のthisはどのように確定しますか?