闭包
JS变量的作用域
变量的作用域分为:全局作用域、函数作用域、块级作用域。
函数内部可以访问外部的变量:
var name = "Jack"; function displayName() { console.log(name) }
但是函数外部不能访问内部的变量:
function displayName() { var name = "Jack"; } console.log(name)
那如何在函数外面访问函数内部的变量呢,聪明的你肯定想到如下操作:
function makeFunc() { var name = "Jack"; function displayName() { console.log(name); } return displayName; } const displayName = makeFunc(); console.log(displayName())
通过外部函数makeFunc
返回了内部函数displayName
,外界执行displayName
就能访问name
变量了。该例子就是一个闭包。
闭包的概念
闭包是一个函数及其周边环境状态的引用的组合。就是可以从内部函数访问外部函数的的作用域。MDN的介绍。
闭包起到了外界与外部函连接的桥梁作用。
闭包的实际用途
- 可以读取函数内部变量,上面例子中的
name
变量,通过闭包可以读取到。 - 保存函数环境的状态,不会再外部环境调用后自动清楚
闭包的缺点
-
闭包会使函数的变量保存在内存中,导致内存消耗很大,严重时造成页面性能问题,在低版本浏览器会造成内存泄漏;