闭包

  |  

闭包是js中很重要的概念

作用域

在说闭包前,先了解js的作用域

作用域

作用域指变量能够被访问到的范围,也称变量作用域

全局作用域,浏览器(window), Node(global)

函数作用域 function内部

块级作用域(es6新增,let、const声明的变量)

作用域链

由于作用域层级的关系,导致出现作用域链
一般(全局作用域 包含(函数作用域 -》 包含(函数作用域和块级作用域) 和 块级作用域))

function outer(){
let a = 1
const inner = function(){
console.log(a)
}
return inner
}

闭包

一般来说,函数作用域的变量,一旦函数执行完就会被释放

但是如果函数内部嵌套函数,而且内部函数使用外部的变量,就有可能导致外部函数变量得不到释放,
这样内部函数就可以一直访问,从而形成闭包
简单说,当前环境中存在指向父级作用域的引用

function outer(){
let a = 1
const inner = function(){
console.log(a)
}
return inner
}

闭包的应用

once() 函数

function once(fn) {
let returnValue;
let canRun = true;
return function runOnce() {
if (canRun) {
returnValue = fn.apply(this, arguments);
canRun = false;
}
return returnValue;
};
}
function process(title) {
console.log({
title,
});
}
const processonce = once(process);
const title = "DevPoint";
processonce(title);
processonce(title);
processonce(title);
// 只会输出一次

节流防抖中也用到了闭包

还有其他很多的例子

闭包的优缺点

  • 优点:

1.可以将一个变量长期储存在内存中,用于缓存

2.可以避免全局变量的污染

3.加强封装性,是实现了对变量的隐藏和封装

  • 闭包的缺点:

1.因为函数执行上下文AO执行完不被释放,所以会导致内存消耗很大,增加了内存消耗量,影响网页性能出现问题

2.而且过度的使用闭包可能会导致内存泄漏,或程序加载运行过慢卡顿等问题的出现, 所以我们可以在退出函数之前, 将不使用的局部变量进行删除

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 作用域
    1. 1.1. 作用域
    2. 1.2. 作用域链
  2. 2. 闭包
  3. 3. 闭包的应用
    1. 3.1. once() 函数
    2. 3.2. 节流防抖中也用到了闭包
  4. 4. 闭包的优缺点
,