第2章:
5475 ワード
グローバル変数
グローバル変数の使用を最小化
var宣言は1回のみ使用
ループではlengthが開始され、使用される符号化ルールが遵守される
グローバル変数の使用を最小化
すべてのJavaScriptランタイム環境にグローバルオブジェクトが存在し、このオプションを使用してグローバルオブジェクトにアクセスします.
グローバル変数の作成は、このグローバルオブジェクトを作成するプロパティと同じです.
グローバル変数の問題
すべてのグローバル変数は同じネーミングスペースに存在します.
アプリケーション内の他の領域で目的の異なるグローバル変数を定義すると、それらは上書きされます.したがって、グローバル変数の使用を最小限に抑える必要があります.
ネーミングスペースモードまたはインスタント実行関数の使用
javascriptにはグローバルを黙示する概念があるからです.
宣言されていない変数は、自動的にグローバルオブジェクトのプロパティとなり、明示的に宣言されたグローバル変数とは無差別に使用されます.function(){
//암묵적 전역
result = x + y;
return result;
}
function(){
//var로 변수를 선언
var result = x + y;
return result;
}
サイレントグローバルを作成するもう一つの逆モードは、var宣言で連続的に割り当てられます.
aは領域変数、bはグローバル変数function(){
//안티패턴 사용하지 말것
var a = b = 0;
}
:評価は右から左へ行っているので
b=0の式が評価され、bは宣言されていない状態にある
この式の戻り値0は、varaとして再宣言された新しい領域変数に割り当てられます.
すなわち、前のコードはvara=(b=0)である.になる
var a, b;事前に宣言されている場合、グローバル変数は生成されません.
var宣言時の副作用を無視
グローバル変数と明示的に宣言された変数の間に存在する違いは、次のとおりです.
delete演算子を使用して変数の定義をキャンセルできますか?
function(){
//암묵적 전역
result = x + y;
return result;
}
function(){
//var로 변수를 선언
var result = x + y;
return result;
}
function(){
//안티패턴 사용하지 말것
var a = b = 0;
}
(プログラムに作成されたが関数に属さない変数)
削除可能
var global_var = 1;
global_novar = 2;
(function (){
global_fromfunc = 3;
}());
//삭제해본다
delete global_var; //false
delete global_novar; //true
delete global_fromfunc; //true
//삭제되었는지 확인
typeof global_var; //"number"
typeof global_novar; //"undefined"
typeof global_fromfunc; //"undefined"
propertyはdelete演算子で削除できますが、変数はオブジェクトへのアクセス
ブラウザではwindowプロパティからグローバルオブジェクトにアクセスできます
別の環境では、専門家は別の名前と呼ばれているか、存在しない可能性があります.
Windowsという識別子を直接使用してグローバルオブジェクトにアクセスしたくない場合は、
関数の有効範囲では、次のように定義されます.関数の有効範囲が重なっても大丈夫です
var global = (function(){
return this;
}());
常にグローバルオブジェクトを取得できますnewとジェネレータを使用して関数を呼び出さず、直接関数として呼び出します.
関数では常にグローバルオブジェクトを指すため(ES 5では適用されません)
cf)たとえば、ライブラリを開発している場合は、
ライブラリコードをインスタント実行関数でパッケージし、グローバル有効範囲をインスタント実行関数のパラメータで表す方法があります.
単一varモード(関数の上部にvar宣言を1回のみ書き込むモード)
関数で必要なすべての領域変数を1つの場所で見つけることができます.
変数を宣言する前に使用するときに論理的なエラーを防止
これにより、グローバル変数を最小化できます.
変数宣言時に初期値で初期化
オブジェクトを割り当てる変数か整数を割り当てる変数かを推定できます.
がんばってください。
var宣言は複数の場所で使用できますが、関数の上部で宣言されたのと同じ動作をします.
ループ
forループでは、通常、配列やパラメータ、HTML Collectionなどに似たオブジェクトが巡回します.
for (var i = 0; i < myarray.length; i++){
//myarray[i]를 다루는 코드
}
for (var i = 0; max = myarray.length; i < max; i++){
//myarray[i]를 다루는 코드
}
このようにlengthは1回しか必要とせず,サイクル中にこの値を用いてサイクルをさらに最適化することができる.forゲートには2つの変形モードがあります
var i, myarray = [];
for (i = myarray.length; i--;){
//myarray[i]를 다루는 코드
}
while 루프 사용
var myarray = [];
i = myarray.length;
while (i--){
//myarray[i]를 다루는 코드
}
にゅうりょくループ
非配列オブジェクトで巡回する場合にのみ使用
for inでリングを開く
for inにはpropertyをリストする順序は規定されていません
配列-for
オブジェクト-for-in
jsでは配列はオブジェクトですが、for inの使用は推奨されません.
オブジェクトのプロパティを巡回する場合は、hasOwnProperty()を使用してプロパティチェーンに沿って継承されたプロパティをフィルタリングする必要があります.これにより、clone()は生成されません.
組み込みビルダープロトタイプを展開/展開しない
組み込みジェネレータのプロトタイプを拡張しないほうがいいです
例外を許可するには、次の条件を満たさなければなりません.
サポートされているブラウザで、JavaScriptエンジンに
スイッチモード
var inspect_me = 0;
result - '';
switch (inspect_me){
case 0:
result = "zero";
break;
}
case 1:
result = "one";
break;
default:
result = "unknown";
}
各case文をswich文に整列各case文にコードをインデント
各case文は明確に割り込みで終了する
ブレイクをスキップして通過しない
swich文の最後にdefault文を書き、対応するcase文がない場合でも正常な結果を生成できるようにします.
暗黙型鋳造の回避
js変数の比較時にデフォルトでタイプ選択を実行
false==0または"==0などの比較はtrueを返す
暗黙型鋳造による混同を防止するために、式の値とタイプの==と!=を常にチェックします.演算子を使用するには
eval()を避ける
この関数は任意の文字列を受信しjsコードで実行します
ダイナミックプログラムに近づくと、カッコマーキング法はより簡単でより良い方法です.
//안티패턴
var property = "name";
alert(eval("obj." + property));
//권장안
var property = "name";
alert(obj[property]);
newFunction()ジェネレータの使用もeval()に似ているので注意が必要ですnewFunction()で評価されたコードは、ゾーン関数の有効範囲内で実行されます.
利点はvarと宣言された変数が自動的にグローバル変数にならないことです.
グローバル変数に自動的になるのを防止するために、eval()呼び出しを直ちに実行関数で包む方法もあります.
evalと関数生成器の別の違いはeval()が有効範囲チェーンに干渉する可能性があるが,Funtionはさらにカプセル化されることである.
Functionは、グローバル有効範囲を表示できるため、ゾーン変数を汚染することなくどこでも実行できます.
(function (){
var local = 1;
eval("local - 3; console.log(local)"); //3이 출력 된다
console.log(local); //3이 출력된다
}());
var local = 1;
(function (){
var local = 1;
Function("console.log(typeof local);")();
}());
eval()は、外部有効範囲にアクセスおよび変更できます.Functionはそうはできない
ParseInt()で数値を変換
ParseInt()を使用すると、文字列から数値を取得できます.
2番目のパラメータとして基数を受け入れるのは、通常は省略されますが、そうすることはできません.
割り当てる文字列が0で始まると、問題が発生する可能性があります.
Reference
この問題について(第2章:), 我々は、より多くの情報をここで見つけました https://velog.io/@yumyum123/JsPatterns02テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol