JS|グローバル変数の停止🖐
8675 ワード
グローバル変数の問題
グローバル変数
グローバル変数は、グローバルコードで宣言された変数です.
グローバル変数のライフサイクルは、アプリケーションのライフサイクルと同じです.cf)領域変数のライフサイクルは関数のライフサイクルと同じである.var x = 'global'; // 전역 변수
function foo () {
console.log(x); // 지역 변수 x의 호이스팅으로 인해 undefined 출력
var x = 'local'; // 지역 변수
}
foo();
console.log(x); // global 출력
var
キーワードとして宣言されたグローバル変数は、グローバルオブジェクトのプロパティになります.*var
キーワードで宣言されるグローバル変数のライフサイクルは、「グローバルオブジェクト」のライフサイクルと同じです.
暗黙結合
「連結を抑制」を使用すると、すべてのコードがグローバル変数を参照および変更できます.
変数の有効範囲が大きいほど、コードの可読性が悪くなり、意外にステータスが変更される可能性があります.
ロングライフサイクル
グローバル変数は、ライフサイクルが長いため、メモリリソースを消費します.var
キーワードとして宣言された変数では、再割り当てが許可されます.グローバル変数は、変数名が重複しているため、予期せぬ再割り当てが発生する可能性があります.
チェーンの末端に存在
グローバル変数は、スキャンチェーンの最末端に存在します.◇チェーンをスキャンして変数を検索する場合、グローバル変数の検索速度が最も遅い.
ネームスペース汚染
ファイルが分離されていても、JavaScriptはグローバルスキャンを共有します.◆他のファイルで同じ名前で宣言されたグローバル変数またはグローバル関数が同じscopeに存在する場合、予想外のエラーが発生する可能性があります.네임스페이스(Namespace)
:オブジェクトを区別できる範囲を示すネーミングスペース.1つのネーミングスペースでは、1つの名前が1つのオブジェクトのみを指します.
グローバル変数の使用を防止する方法
グローバル変数の盲目的な使用は非常に危険です!
グローバル変数を使用する必要がない限り、領域変数を使用する必要があります.変数のスキャンが小さいほどいいです!
インスタント実行関数
インスタント実行関数は1回のみ呼び出されます.
コードが即時実行関数に囲まれると、すべての変数が即時実行関数の領域変数になります.(function () {
var a = 1;
// ...
}());
console.log(a); // ReferenceError
ネームスペースオブジェクト
ネームスペースオブジェクトを作成し、グローバル変数として使用する変数をPropertyに追加します.
ネーミングスペースを分離すると、識別子の競合を防止できますが、ネーミングスペースオブジェクト自体がグローバル変数に割り当てられます.var NAMESPACE = {};
NAMESPACE.name = 'Sol';
console.log(NAMESPACE.name); // Sol 출력
// ---------------------------------------------
NAMESPACE.person = {
name: 'Sol',
age: 20
};
console.log(NAMESPACE.person.name); // Sol 출력
モジュールアレイ
クラスを模倣することにより,相関変数と関数を集合させ,即時実行関数で包み,모듈
を生成する.
JavaScriptのモジュールモードは클로저
に基づく.実装可能
JavaScriptではアクセス制限がないため、モジュールモードを使用して「情報の非表示」を実現します.var Counter = (function () {
var num = 0; // private 변수
// 외부로 공개할 데이터나 메서드를 프로퍼티로 추가한 객체
return {
increase() {
return ++num;
},
decrease() {
return --num;
}
};
}());
console.log(Counter.num); // undefined => num 변수는 외부로 노출되지 않음.
console.log(Counter.increase()); // 1
console.log(Counter.decrease()); // 0
ES 6モジュール
ES 6モジュールはファイル自体の独立したモジュールスキャンを提供するため、グローバル変数は使用できません.
➊ES 6モジュールは、変換またはバンドルが必要なため、実装ブラウザでは機能しないため、モジュールバンドルパッケージ(Webパッケージなど)が一般的に使用される.
Ref
[図書]李雄模、ファッションjavascript Deep Dive⌟、Wekibooks、2020
Reference
この問題について(JS|グローバル変数の停止🖐), 我々は、より多くの情報をここで見つけました
https://velog.io/@solseye/JS-전역-변수-멈춰
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
var x = 'global'; // 전역 변수
function foo () {
console.log(x); // 지역 변수 x의 호이스팅으로 인해 undefined 출력
var x = 'local'; // 지역 변수
}
foo();
console.log(x); // global 출력
(function () {
var a = 1;
// ...
}());
console.log(a); // ReferenceError
var NAMESPACE = {};
NAMESPACE.name = 'Sol';
console.log(NAMESPACE.name); // Sol 출력
// ---------------------------------------------
NAMESPACE.person = {
name: 'Sol',
age: 20
};
console.log(NAMESPACE.person.name); // Sol 출력
var Counter = (function () {
var num = 0; // private 변수
// 외부로 공개할 데이터나 메서드를 프로퍼티로 추가한 객체
return {
increase() {
return ++num;
},
decrease() {
return --num;
}
};
}());
console.log(Counter.num); // undefined => num 변수는 외부로 노출되지 않음.
console.log(Counter.increase()); // 1
console.log(Counter.decrease()); // 0
Reference
この問題について(JS|グローバル変数の停止🖐), 我々は、より多くの情報をここで見つけました https://velog.io/@solseye/JS-전역-변수-멈춰テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol