Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ECMA262-Edition5.1読書会 第10条 実行可能コードと実行コンテキスト

YukiFujisawa
September 29, 2014

ECMA262-Edition5.1読書会 第10条 実行可能コードと実行コンテキスト

第6回 ECMA-262 Edition5.1読書会での登壇資料です。
https://ecma262reading.doorkeeper.jp/events/15080

第10条を要約しました。

YukiFujisawa

September 29, 2014
Tweet

More Decks by YukiFujisawa

Other Decks in Programming

Transcript

  1. 実行可能コードの種類は? globalコード evalコード functionコード ・ECMAScriptのProgramとし て扱われるソーステキスト ・FunctionBodyのソーステキ ストは含まない ・eval関数に指定さ れたソーステキスト

    ・globalコードとし て認識される ・FunctionalBodyの一部として解 析されたソーステキストのこと ・コンストラクタである組み込み Functionオブジェクトを使った場 合のソーステキストを意味する ・globalコード、evalコード、functionコードの3種類
  2. レキシカル環境とは? Environment Recordとは?  レキシカル環境は以下から構成される  Environment Record  nullである可能性のある外側のレキシカル

    環境  Environment Recordとは、  それぞれの レキシカル環境のスコープで  識別子のバインディングを記録するための  オブジェクトである
  3. レキシカル環境のスコープ (静的スコープ) A { var x; } B { var

    x; // A内のxとは別物 C { var y; // Cの内側からしか 見えない } } レキシカル環境のスコープ⇒静的スコープ function A() { var x = "A"; // 他の関数からはアクセスできない return x; } function B() { var x = "B"; // 関数Aの変数xとは別もの function C() { var y = "C"; return x + y; // 関数Bの変数xにアクセスできる } return C(); } alert(A()); // >>A alert(B()); // >>BC
  4. 動的スコープ var x = 123 A { var x =

    456 call C // 456と出力される } B { call C // 123と出力される } C { print x // 呼び出し元によって x の値が変わる } 静的スコープではない⇒動的スコープ
  5. 10.2.1 Environment Record詳細  Environment Recordとは、 それぞれの レキシカル環境のスコープで 識別子のバインディングを記録するための オブジェクトである

     Environment Record:抽象クラス  実装クラス1:宣言的Environmnt Record  実装クラス2:オブジェクトEnvironment Record
  6. 例:TryStatement try { ... } catch (e) { // "e"

    が宣言的Environment Recordにバインディングされる ... }
  7. 例:グローバルオブジェクト (this, window) var a = 10; console.log(a); // 10

    // "this" in the global context //is the global object itself console.log(this.a); // 10 // "window" is the reference to the // global object in the browser environment console.log(window.a); // 10
  8. 例:WithStatement var a = 10; var b = 20; with

    ({a: 30}) { console.log(a + b); // 50 } console.log(a + b); // 30, restored
  9. 10.3 実行コンテキスト LexicalEnvironment VariableEnvironment ThisBinding 実行コンテキストない に内のコードによって 作成された識別子リ ファレンスを解決する めに使用されたレキシ

    カル環境を識別する ・実行コンテキスト内にあ るVariableStatementsと FunctionDeclarationsに よって生成されたBinding を保持するEnvironment Recordであるレキシカル 環境を識別する ・この実行コンテキス トと関連づく ECMAScriptコード内 にあるthisキーワード に関連づけられた値 実行コンテキストの構成要素
  10. 10.1-10.4のまとめ var a = 10; function foo() { var b

    = 20; console.log(a); } with ({a: 20}) { var bar = function () { console.log(a); }; foo(); bar(); }
  11. 10.1-10.4のまとめ function foo() { var b = 20; console.log(a); }

    ---------------------------------------- //何もしない。実行時に評価される
  12. 10.1-10.4のまとめ with ({a: 20}) { ---------------------------------------- //global実行コンテキストのlexicalEnvironmentを退避 previousEnvironment = globalContext.lexicalEnvironment;

    //新規lexicalEnvironmentの作成(レキシカル環境識別のため) globalContext.lexicalEnvironment = { オブジェクトEnvironmentRecord: {a: 20}, outer: globalContext.lexicalEnvironment };