JavaScript学習ノート(三):JavaScriptにもエントリMain関数

2762 ワード

CとJavaには、プログラムのエントリ関数またはメソッド、すなわちmain関数またはmainメソッドがあります.JavaScriptでは、プログラムはJSソースファイルのヘッダから実行されます.しかし、ある意味では、プログラムの起点としてmain関数をフィクション化することができます.そうすれば、他の言語と統一できるだけでなく、JSをもっと理解できるかもしれません.
1.実際の入り口
JavaScriptファイルをJSエンジンに渡すと、JSエンジンはすべてのコードが実行されるまで、上から下へ各文を1つずつ実行します.
2.役割ドメインチェーン、グローバル役割ドメイン、およびグローバルオブジェクト
JSの各関数は実行時に新しい役割ドメインを生成することを知っています.具体的には、実行プロセスが関数に入ると、新しい役割ドメインが作成され、関数の実行が完了すると、この役割ドメインが破棄されます.関数のパラメータ、ローカル変数はこの役割ドメインにバインドされ、関数呼び出しが役割ドメインの破棄を完了すると、破棄されます.もちろん、特別な場合、関数が戻ってきたときに役割ドメイン内のいくつかの変数が参照されている場合、役割ドメインおよびこれらの参照された変数は破棄されず、いわゆる閉パケットを形成します.
一方,関数はネスト可能であることを知っており,役割ドメインもネスト可能である.関数が定義されると、JSエンジンは各関数に[[scope]]という組み込み属性を設定し、外部関数の文法的役割ドメインを指します.このようにして、複数の作用ドメインは、作用ドメインチェーンと呼ばれるチェーン構造を形成する.通常、任意の時点で1つの役割ドメインチェーンのみが存在し、すなわち、実行中の関数の役割ドメインから最外層のグローバル役割ドメインまで階層的に遡る.
[注]:役割ドメインチェーン上の関数はJSソースコード内の階層的にネストされた関数であり,関数実行時の順序や関数呼び出しスタックとは無関係であり,これも文法役割ドメインという呼称の由来である.
グローバル役割ドメインは特殊な役割ドメインであり、関数役割ドメインではありませんが、すべての関数役割ドメインの外層役割ドメインであり、すべての役割ドメインチェーンの終点でもあります.したがって,プログラムが終了しない限り,グローバル役割ドメインは常に存在し,グローバル役割ドメイン内の変数も常に有効である.
[関数3の役割ドメイン]-->[関数2の役割ドメイン]-->[関数3の役割ドメイン]-->[グローバル役割ドメイン]
また、グローバル役割ドメインに対応するグローバルオブジェクトもあります.ブラウザでは、グローバルオブジェクトがwindowオブジェクトです.グローバルオブジェクトは特殊なオブジェクトです.
グローバル役割ドメインで定義された変数は、グローバルオブジェクトにバインドされます.
任意の役割ドメインで定義された変数は、定義時にvarキーを使用しない場合、グローバルオブジェクトにバインドされます.
グローバル役割ドメインでは、thisはグローバルオブジェクトを指します.
上記の特性から,グローバル役割ドメインをオブジェクトとすると,実際にはグローバルオブジェクトであることがわかる.また、グローバルな役割ドメインでは、次の4つの文がなぜ等価なのかを説明します.

var a = 1;
a = 1;
window.a = 1;
this.a = 1;

3.架空のmain関数
すべて役割ドメインである以上、なぜ特殊なグローバル役割ドメインがあるのでしょうか.私たちはいつも単純化、一貫性が好きで、できるだけ複雑化、特殊性を避けます.だから自然に、グローバルな役割ドメインを関数の役割ドメインと変わらないように見せることができますか?答えは肯定的だ.私たちはこのような構想をすることができます.
JSエンジンでソースファイルを実行すると、mainという関数にファイルのコードがパッケージされることを想像します.そしてこのmain関数をプログラムのエントリとします.つまり、JSファイルにこのようなコードがあるとします.

var a = 1;
var b = 2;

function add(x, y) {
  var z = x + y;
  return z;
}
console.log(add(a, b));

JSエンジンはプログラムが実行される前にmain関数にパッケージされます.

//    main  
function main() {
  var a = 1;
  var b = 2;

  function add(x, y) {
    var z = x + y;
    return z;
  }

  console.log(add(a, b));
}

次に、このmain関数を呼び出します.

main._current_scope_ = window; //       (  )  window
main.call(window) //  this  window

4.意味は何ですか.
(1)JSにもエントリ関数mainがあり,他の言語と一致している.
(2)グローバル役割ドメインの概念を省く,あるいはグローバル役割ドメインも関数役割ドメインとなる.
(3)main関数の呼び出しプロセスにより,グローバル役割ドメインにおけるそれらの特殊な性質の由来を理解できる.
(4)最後に,すべてのJSソースコードを1つの関数とし,後でイベントキュー,イベントループを話すための敷居とする.
以上、編集者がご紹介したJavaScript学習ノート(3):JavaScriptにも入口Main関数がありますので、お好きになってください.