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:可能改变父函数内部变量的值

上一篇js作用域