有不少开发人员总是搞不清匿名函数和闭包这两个概念,因此经常混用。闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数,仍以前面的createComparisonFunction()函数为例,注意value1和value2:
function createComparisonFunction(propertyName) {
return function(object1, object2){
var value1 = object1[propertyName];
var value2 = object2[propertyName];
if (value1 < value2){
return -1;
} else if (value1 > value2){
return 1;
} else {
return 0;
}
};
}
闭包与变量
作用域链的这种配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值。别忘了闭包所保存的是整个变量对象,而不是某个特殊的变量。下面这个例子可以清晰地说明这个问题:
function createFunctions(){
var result = new Array();
for (var i=0; i < 10; i++){
result[i] = function(){
return i;
};
}
return result;
}
最终结果每个函数都返回 10
但是,我们可以通过创建另一个匿名函数强制让闭包的行为
符合预期,如下所示:
function createFunctions(){
var result = new Array();
for (var i=0; i < 10; i++){
result[i] = function(num){
return function(){
return num;
};
}(i);
}
return result;
}
关于this对象
具体使用场景如下:
- 做为普通函数 直接返回window
- 使用call、apply、bind 传入什么就绑定什么
- 作为对象方法被调用 就返回对象本身
- 在calss类中被调用 当前实例本身
- 箭头函数 找上级作用域的this
⚠️: this取什么值是在函数执行时确定的,不是在函数定义时确定的
闭包的优点和弊端
- 闭包的好处:
1.希望一个变量长期保存内存中; 2.避免全局变量污染;
3私有成员的存在。
- 闭包的缺点:
1.常驻内存,增加内存使用量;
2.使用不当造成内存泄漏。