参考「JavaScriptの高度なプログラミング」
レディ
実行環境は、他のデータ変数を定義するか、関数がアクセス権を持っています
各関数は、独自の実行環境を持っています
各実行環境変数オブジェクトは、それに関連付けられています
コードは、環境内で実行されると、スコープチェーンの可変オブジェクト(スコープチェーン)を作成します。
スコープチェーンの使用:すべての変数への秩序のアクセスを確保し、関数が実行環境へのアクセス権を持っています。
クロージャ
変数関数スコープの他の機能にアクセスする権利。
閉鎖に一般的な方法の作成:別の関数に内部関数を作成します
違い
関数内の変数にアクセスする場合、それはスコープチェーンからの適切な名前を持つ変数を検索します。
一般に、関数が終了すると、ローカルアクティブオブジェクトのみグローバルスコープ(グローバル実行環境の変数オブジェクト)メモリに格納され、破壊されます。
しかし、定義された関数内の他の機能(閉鎖イベントは、オブジェクトの機能を含むことになる(すなわち、外部関数))は、その範囲内のチェーンに加えました。
コードの実験
/**
* 返回根据属性propertyName对两个对象的比较方法
*/
function createComparisonFunction(propertyName) {
let globalVal = "ok";
return function(object1, object2) {
console.log("createComparisonFunction作用域中的globalVal是, ", globalVal);
let value1 = object1[propertyName];
let value2 = object2[propertyName];
if (value1 < value2){
return -1;
} else if (value1 > value2){
return 1;
} else {
return 0;
}
};
}
/**
* 测试闭包会将包含函数的活动对象添加到它的作用域链中
*/
function test1(){
let p1 = {"age": 10};
let p2 = {"age": 11};
let cmpFunc = createComparisonFunction("age");
console.log("p1和p2的比较结果是", cmpFunc(p1, p2));
//注意下面第二次执行cmpFunc的时候依然可以获取globalVal的值
console.log("p2和p1的比较结果是", cmpFunc(p2, p1));
//解除引用,释放内存
comFunc = null;
}
test1();
//输出如下
createComparisonFunction作用域中的globalVal是, ok
p1和p2的比较结果是 -1
createComparisonFunction作用域中的globalVal是, ok
p2和p1的比较结果是 1
特別な
クロージャは任意の変数に含まれる関数の最終値を獲得することができます。
クロージャ全体の変数のオブジェクトではなく、特定の変数を保存することを忘れないでください。
コード:ループVARに使用注意
/**
* 返回函数数组
*/
function createArrayByFunctions(){
let result = [];
for(var i = 0; i < 10; i++) {
result[i] = function() {
return i;
};
}
return result;
}
/**
* 测试函数数组的函数值
*/
function test2(){
let arr = createArrayByFunctions();
arr.forEach(item => {
process.stdout.write(item()+" ")
});
}
test2();
//输出
10 10 10 10 10 10 10 10 10 10
事故:varが、聞かせて通常の結果を置き換えます
分析:let
ブロックレベルの範囲であり、 var
範囲の関数です。使用する場合は、クロージャがそのように保存されているので、私はそれぞれ異なる値を持ってみましょう。
0 1 2 3 4 5 6 7 8 9