作用ドメインチェーンと閉包のまとめ

3298 ワード

JavaScriptのスコープ
簡単に言えば、作用域は変数と関数のアクセス可能範囲であり、作用域は変数と関数の視認性とライフサイクルを制御している.JavaScriptでは、変数のスコープは大域的なスコープと局所的なスコープの二つがあります.

    var v = 20; //         ,          JS       
     function(){
     var v = 10;//              ,                
}
    alert(v); //  :20
                 。


    //  v     ,           。
    alert(v);  //  :20

関数内のすべての末尾に直接割り当てを定義する変数は、グローバルスコープを持つように自動宣言されます.
function sum(){
    var v = 20;
    b = 10;
    alert(v);
}
sum(); //20
alert(b); //10
alert(v); //    
JavaScriptの中にブロックレベルの作用領域がありますか?

  var m = 5;
  if(m == 5){
    var n = 10;
  }
  alert(n); //  10- JavaScript             JavaScript       


関数が作成されると、そのスコープはこの関数のスコープ内でアクセス可能なデータオブジェクトによって作成されます.
function add(num1,num2) {
    var sum = num1 + num2;
    return sum;
}
関数addを作成すると、そのスコープチェーンにグローバルオブジェクトが入力されます.このグローバルオブジェクトには、すべてのグローバル変数が含まれています.
関数のスコープの特性のために、局所変数は関数全体にわたって常に定義されており、変数宣言を前倒しして関数の上部に行くことができ、変数初期化は元の位置にある.
var scope="global";  
function t(){  
    console.log(scope);  //  "undefined",    "global"
    var scope="local"  
    console.log(scope);  // "local"
}  
t();
sを実行すると、関数sの実行環境(呼び出し対象)を作成し、そのオブジェクトをチェーンの先頭に置いて関数tの呼び出しオブジェクトをリンクした後、最後にグローバルオブジェクトになります.チェーンの先頭から変数nameを探します.明らかにnameは「swy」ですが、ss()を実行すると、nameはtlwyです.
name="lwy";  
function t(){  
    var name="tlwy";  
    function s(){  
        var name="slwy";  
        console.log(name);  
    }  
    function ss(){  
        console.log(name);  
    }  
    s();  
    ss();  
}  
t();
包みを閉じる
クローズドとは、別の関数のスコープにアクセスする権限を持つ変数の関数です.

    function createSumFunction(num1, num2){
        return function () {
            return num1 + num2;
        };
    }

    var sumFun = createSumFunction(3, 4);
    var sum = sumFun();
    alert(sum);

クローズドで使用する局所変数の値は、必ず局所変数の最後の値です.
function a(){
  var n = 0;
  function inc() {
    n++;
    console.log(n);
  }
  inc(); 
  inc(); 
}
a(); //     1,   2
よくある落とし穴、0~9を出力すると思っていますが、まさか10個を出力します.
function createFunctions(){
  var result = new Array();
  for (var i=0; i < 10; i++){
    result[i] = function(){
      return i;
    };
  }
  return result;
}
var funcs = createFunctions();
for (var i=0; i < funcs.length; i++){
  console.log(funcs[i]());
}
上の説明は:
var result = new Array(), i;
result[0] = function(){ return i; }; //     ,      ,       i  !
result[1] = function(){ return i; }; //     ,      ,       i  !
...
result[9] = function(){ return i; }; //     ,      ,       i  !
i = 10;
funcs = result;
result = null;
 
console.log(i); // funcs[0]()     return i   ,    10
console.log(i); // funcs[1]()     return i   ,    10
...
console.log(i); // funcs[9]()     return i   ,    10
クローズドとは、別の関数の変数を参照することです.変数が参照されているので回収されないため、プライベート変数をカプセル化することができます.これは利点でもあります.必要でないクローズドはメモリ消費量を増やすだけです.また、クローズドも変数の値があなたの要求に合致するかどうかに注意します.彼は静的なプライベート変数のようです.