スコープを持つ実行環境
実行環境
可変オブジェクトは、環境変数と関数で定義されたプロパティとメソッドは、オブジェクトであり、関連する実行環境を有しています。
- オブジェクト--windowグローバル実行環境(Webブラウザ)
- 話題の(機能)の実行環境
グローバル変数のオブジェクトのローカル変数オブジェクトは、関数の実行中にのみ存在するが、常に存在します。
スコープ
グローバルおよびローカルスコープに分割し
、ブロックレベルのスコープとES6。
スコープチェーン
環境で実行するとき、それは可変オブジェクトスコープチェーン、機能の内部プロパティに格納されたスコープチェーンを作成し[[scope]]
、変数と関数の保証は、実行環境整然としたアクセスへのアクセスを有します。
-
スコープチェーンのフロントエンド:可変オブジェクトの現在の実行環境は、 - >環境変数を含むオブジェクトは、 - >次の層は可変オブジェクト環境......->地球環境オブジェクトを含みます
-
識別子解像度場合:正面からのレベルの検索範囲チェーンは、背中合わせ、エラーに見つかりません。
スコープチェーンは、本質的に可変オブジェクトへのポインタのポインタのリストです。
注:
機能環境、変数オブジェクトとしてアクティブなオブジェクトは、オブジェクトが最初に引数のみが含ま
キャッチと文で:スコープチェーンを拡張するために
クロージャ
クロージャーは、[機能]の役割にアクセスすることができます別の関数可変ドメインです。
function animals(name){
return function(){
console.log(name);
};
}
var a = animals("cat");
a(); //cat
外部関数を破壊する外部関数が終了を実行した場合でも、独自の、外部関数とグローバル変数変数オブジェクトオブジェクトを含む、スコープチェーンスコープチェーン匿名関数の内部では、外部関数の変数オブジェクトは、まだ無名関数のスコープチェーンによって参照され、したがって、オブジェクトは、メモリ内の外部関数の変数を有し、匿名関数が破壊するとき、その範囲鎖可変オブジェクト参照を破壊します。
クロージャーいくつかの問題
- クロージャは、メモリを取ります
- 全可変オブジェクト保存クロージャは、クロージャを使用する変数への参照であり、同じです
- この閉鎖は、一般的にウィンドウを向けられています
- メモリリーク:あなたが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());