理解闭包
概念
闭包是指 有权访问另一个函数作用域中的变量的 函数。
函数式闭包(在内部保存数据和对外部无副作用)
创建方法
在一个函数内部创建另一个函数(闭包)
原理
普通函数:在outer()执行完,局部变量local被销毁,内存仅仅保存全局作用域。
function outer() {
var localVal = 30;
return localVal;
}
outer(); // 30
闭包:在outer()执行后,func()仍然可以访问outer()内部的localVal,因为func()将outer()的内的活动对象(localVal)添加到了func()的作用域链。在outer()执行后,由于localVal被func()的作用域链所引用,所以localVal不会被销毁,而是存在内存中,直到func()被销毁,才会随之销毁。
function outer() {
var localVal = 30;
return function() {
return localVal;
}
}
var func = outer();
func(); // 30
闭包的应用
- 监听事件
!function() {
var localData = "localData here";
document.addEventListener('click',
function() {
console.log(localData);
}
);
}();
- ajax事件
!function() {
var localData = "localData here";
var url = "http://www.baidu.com/";
$.ajax({
url: url;
success: function() {
console.log(localData);
}
});
}();
错误的使用
循环
使用闭包封装函数,便于使用私有变量。
闭包的好坏
- 好处:灵活方便,封装
- 坏处:空间浪费,内存泄漏(循环引用),性能消耗