14/グローバル変数の問題


グローバル変数を使用するのは危険です...ゾーン変数の使用を推奨します.
この章では、グローバル変数の使用による問題と抑制方法について説明します.
変数のライフサイクル
変数は宣言によって生成され、割り当てによって値が取得され、ある日消えます.(ライフサイクルにはライフサイクルがあります).
ゾーン変数のライフサイクル

変数は、宣言された場所で生成され、消滅します.
関数内部で宣言された領域変数は、関数が呼び出されると生成され、関数が終了すると消失します.すなわち,領域変数のライフサイクルは関数のライフサイクルと一致する.
領域変数は関数生成scopeに登録され、scopeにはレイクシー環境と呼ばれる物理エンティティがあります.したがって、変数は登録されているスキャンプログラムが破棄される(メモリが解放される)前に有効です(通常、関数が終了すると生成されたスキャンプログラムも破棄されますが、スキャンプログラムを参照する人がいる場合、スキャンプログラムは破棄されません=モジュール)
ホイスティンはスコフ単位で動作する
var x = 'global';

function foo() {
	console.log(x); // undefined, 
    var x = 'local';
}
foo();
console.log(x); // global;
グローバル変数のライフサイクル
関数とは異なり、グローバルコードは明示的な呼び出しなしで実行されます.すなわち、コードがロードされるとすぐに解析され、実行されます.グローバルコードは、最後の文が実行され、文が実行されなくなったときに終了します.
varキーワードとして宣言されたグローバル変数は、グローバルオブジェクトのpropertyとなります.これは、グローバル変数のライフサイクルがグローバルオブジェクトのライフサイクルと一致することを意味します.ブラウザ環境では、グローバルオブジェクトはwindowなので、varキーワードとして宣言されたグローバル変数はwindowオブジェクトのpropertyです.すなわち、varキーワードで宣言されるグローバル変数のライフサイクルは、グローバルオブジェクトウィンドウのライフサイクルと一致します.
+)グローバルオブジェクト:
JavaScriptエンジンがコードを実行する前に作成した特殊なオブジェクト.クライアント側環境(ブラウザ)はウィンドウを表し、サーバ側環境(node.js)はグローバルオブジェクトを表す.
グローバル変数の問題と代替案
問題:沈黙の結合、ライフサイクルが長く、スコフチェーンに存在する終点、ネーミング空間汚染
代替案:即時実行関数、ネーミングスペースオブジェクト、モジュールモード(模倣クラス...モジュールベースの動作...非表示情報...);ES 6モジュール(グローバル変数は使用できません...)