モダンjavascript-Deep Dive 14,15[グローバル変数の問題,let constキーワードとブロックレベルスキャン]
グローバル変数の問題
変数のライフサイクル
グローバル変数のライフサイクルは、最後の文が実行され、実行されなくなったときに解除されます.
ゾーン変数の場合、関数体の最後の文または戻り文は、実行時に解除されます.
グローバルオブジェクト
これは、
グローバル変数の問題
無名の結合
これは、コードがどこでも参照および割り当てられることを意味します.
変数の有効範囲が大きいほど可読性が悪くなり、予期せぬ状態になる可能性があります.
ロングライフサイクル
グローバル変数のライフサイクルが長い.そのため、メモリリソースも長期的に消費されます.
スキャンチェーンの終点に存在する
これは、変数を検索すると、グローバル変数が最後に検索されることを意味します.
ネーミングスペース汚染
jsの最大の問題の1つは、ファイルが別々であってもグローバルスキャンを共有することです.
したがって、別のファイルのグローバル変数またはグローバル関数が同じ範囲に存在する場合、予想外の結果が発生する可能性があります.
グローバル変数を無効にする方法
グローバル変数を使用する必要がある理由が見つからない場合は、領域変数を使用します.変数のスキャンは狭いほど良い.
インスタント実行関数
すべてのコードをインスタント実行関数として監査すると、すべての変数がインスタント実行関数の領域変数になります.
(function () {
var foo = 10;
// ...
}());
console.log(foo()) // undefined
ネームスペースオブジェクト
ネーミングスペースを分離すると、識別子の競合を防止できますが、ネーミングスペースオブジェクト自体がグローバル変数に割り当てられるため、あまり役に立ちません.
var MYAPP = {}; // 네임스페이스 객체
MYAPP.name = "Lee";
console.log(MYAPP.name);
MYAPP.person = {
name:"lee",
address:"busan"
}
モジュールモード
モジュールモードは,クラスを模倣し,関連する変数と関数を集合させ,即時実行関数で1つのモジュールに囲むモードである.
var Counter = (function () {
// private 변수
var num = 0;
// 외부로 공개할 데이터나 메서드를 프로퍼티로 추가한 객체를 반환한다.
return {
increase(){
return ++num;
},
decrease(){
return --num;
}
};
}());
console.log(Counter.num) // undefined
console.log(Counter.increase()) // 1
console.log(Counter.increase()) // 2
console.log(Counter.decrease()) // 1
ES 6モジュール
ES 6モジュールは、ファイル自体の独立したモジュールスキャンを提供する.したがって、モジュール内でvarキーワードとして宣言された変数はグローバル変数ではなく、windowオブジェクトのpropertyではありません.
<script type="module" src="lib.mjs"></script> // type module로 선언 확장자는 mjs를 권장한다.
<script type="module" src="lib.mjs"></script>
let constキーワードとブロックレベルスキャン
varキーワードで変数を宣言する問題
繰り返し宣言を許可する変数
変数反発:実行時より前に宣言し、宣言前に宣言に値を割り当てることができるため、予測できません.
letキーワード
特長
constキーワード
特長
js変数ガイド
letキーは、
Reference
この問題について(モダンjavascript-Deep Dive 14,15[グローバル変数の問題,let constキーワードとブロックレベルスキャン]), 我々は、より多くの情報をここで見つけました https://velog.io/@gavri/모던-자바스크립트-Deep-Dive-1415-전역-변수의-문제점let-const-키워드와-블록레벨-스코프テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol