閉鎖JavaScriptのスコープチェーン

スコープを持つ実行環境

実行環境

可変オブジェクトは、環境変数と関数で定義されたプロパティとメソッドは、オブジェクトであり、関連する実行環境を有しています。

  1. オブジェクト--windowグローバル実行環境(Webブラウザ)
  2. 話題の(機能)の実行環境

グローバル変数のオブジェクトのローカル変数オブジェクトは、関数の実行中にのみ存在するが、常に存在します。

スコープ

グローバルおよびローカルスコープに分割し
、ブロックレベルのスコープとES6。

スコープチェーン

環境で実行するとき、それは可変オブジェクトスコープチェーン、機能の内部プロパティに格納されたスコープチェーンを作成し[[scope]]、変数と関数の保証は、実行環境整然としたアクセスへのアクセスを有します。

  1. スコープチェーンのフロントエンド:可変オブジェクトの現在の実行環境は、 - >環境変数を含むオブジェクトは、 - >次の層は可変オブジェクト環境......->地球環境オブジェクトを含みます

  2. 識別子解像度場合:正面からのレベルの検索範囲チェーンは、背中合わせ、エラーに見つかりません。

スコープチェーンは、本質的に可変オブジェクトへのポインタのポインタのリストです。

注:
機能環境、変数オブジェクトとしてアクティブなオブジェクトは、オブジェクトが最初に引数のみが含ま
キャッチと文で:スコープチェーンを拡張するために

クロージャ

クロージャーは、[機能]の役割にアクセスすることができます別の関数可変ドメインです。

function animals(name){
    return function(){
        console.log(name);
    };
}
var a = animals("cat");
a();    //cat

外部関数を破壊する外部関数が終了を実行した場合でも、独自の、外部関数とグローバル変数変数オブジェクトオブジェクトを含む、スコープチェーンスコープチェーン匿名関数の内部では、外部関数の変数オブジェクトは、まだ無名関数のスコープチェーンによって参照され、したがって、オブジェクトは、メモリ内の外部関数の変数を有し、匿名関数が破壊するとき、その範囲鎖可変オブジェクト参照を破壊します。

クロージャーいくつかの問題

  1. クロージャは、メモリを取ります
  2. 全可変オブジェクト保存クロージャは、クロージャを使用する変数への参照であり、同じです
  3. この閉鎖は、一般的にウィンドウを向けられています
  4. メモリリーク:あなたがHTMLの閉鎖要素を保存した場合、この要素が破壊されることはありません

ブロックレベルのスコープの模倣

function test(){
    for(var i=0; i< 10; i++){
        console.log(i);
    }
    console.log(i); //在这里还可以访问到 i
}

ブロックレベルの構文例の模造スコープ:

function test(){
    (function(){
        /*块级作用域*/
        for(var i; ...){...}
    })();
    console.log(i); //报错~
}

過度のグローバルスコープの変数と関数を避けるために、グローバルスコープで一般的に使用される機能を追加します。

プライベート変数

コンストラクタで使用される、カスタム型のメソッドをプライベート変数、プライベート機能と権限を作成します

//
function Person(name){  //name和age是私有变量
    var age = 10;
    function myAge(){  //私有函数
        return age;
    }
    this.getAge = function(){
        return myAge(); //用特权方法访问私有函数和属性
    }
    this.getName = function(){  //特权方法
        return name;
    };
    this.setName = function(newName){   
        name = newName;
    };
}

//プライベート静的変数

(function(){
    var name = "";
    Person = function(value){
        name = value;
    };
    Person.prototype.getName = function(){
        return name;
    };
    Person.prototype.setName = function(value){
        name = value;
    };
})();
var p1 = new Person("Sam");
console.log(p1.getName());      //Sam
var p2 = new Person("Ben");
console.log(p2.getName());      //Ben
console.log(p1.getName());      //Ben

モジュールモード

var add = (function(){
    var count = 0;
    return {    //返回一个对象,定义公共接口访问私有变量和函数
        increase: function(){  return count += 1; },
        decrease: function(){   return count -= 1; },
        value: function(){  return count; }
    };
})();
add.increase(); //
console.log(add.value());

おすすめ

転載: www.cnblogs.com/qiuqiubai/p/12549670.html