第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演算子を使用して変数の定義をキャンセルできますか?
  • varを使用して明示的に宣言されたグローバル変数
    (プログラムに作成されたが関数に属さない変数)
  • は削除できません.
  • varを使用して作成されないデフォルトのグローバル変数
    削除可能
  • デフォルトのグローバル変数は、厳密にはグローバルオブジェクトのpropertyであり、変数ではありません.
    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()は生成されません.
    組み込みビルダープロトタイプを展開/展開しない
    組み込みジェネレータのプロトタイプを拡張しないほうがいいです
    例外を許可するには、次の条件を満たさなければなりません.
  • ECMASCrpt 5に記載の方法がブラウザに埋め込まれていない場合、この方法を追加することができる.この場合、事前定義方法
  • プリフェッチプログラムまたは方法は既に存在するか、コード内のある場所で実装されている.
    サポートされているブラウザで、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で始まると、問題が発生する可能性があります.