js中的闭包
文章类型:Javascript
发布者:admin
发布时间:2023-02-24
一原理:
定义:
闭包就是一个可以访问其他函数内部变量的函数。本质就是作用域链的一个特殊的应用,
当访问一个变量时,代码解释器会首先在当前的作用域查找,如果没找到,就去父级作用域去查找,直到找到该变量或者不存在父级作用域中
在通常情况下,函数内部变量无法在外部访问,创建闭包的最常见的方式就是在一个函数内创建另一个函数,创建的函数可以 访问到当前函数的局部变量。
用途:
1:函数外部能够访问到函数内部的变量
2:已经运行结束的函数上下文中的变量对象继续留在内存中,保留这个变量对象的引用,不会被回收
特性:
1:函数嵌套函数
2:内部函数可以访问外部函数的变量
3:参数和变量不会被回收
二:形式:
1:返回一个函数或者父级作用域引用存在
function fun1() {
var a = 1;
return function(){
console.log(a);
};
}
fun1();
var result = fun1();
result(); // 1
var fun3;
function fun1() {
var a = 2
fun3 = function() {
console.log(a);
}
}
fun1();
fun3();
2:在定时器、事件监听、Ajax 请求、Web Workers 或者任何异步中,只要使用了回调函数,实际上就是在使用闭包
setTimeout(function handler(){
console.log('1');
},1000);
// 事件监听
$('#app').click(function(){
console.log('Event Listener');
});
3:函数传递的形式
var a = 1;
function foo(){
var a = 2;
function baz(){
console.log(a);
}
bar(baz);
}
function bar(fn){
// 这就是闭包
fn();
}
foo(); // 输出2
4:IIFE(自执行匿名函数,立即执行函数),创建了闭包,保存了全局作用域(window)和当前函数的作用域,拥有独立的作用域,避免了外界访问变量又不会污染全局作用域
var a = 2;
(function IIFE(){
console.log(a); // 输出2
})();
三:优缺点
优点:
1:减少全局变量的定义,避免变量污染
2:能够读取函数内部的变量
3:内存中存在,可以做缓存
缺点:
1:造成内存泄漏
2:造成性能损失,因为跨作用域访问,
3:可能改变父函数内部变量的值