为什么有闭包机制?
-
为了自身的正常运行, 需要把用到的外部作用域存储在自身, 防止其释放
Closure闭包:
-
一种称呼, 代表函数作用域的一种状态: 被其他函数存储在 scopes 中,无法释放
官方描述:
-
闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在 JavaScript 中,闭包会随着函数的创建而被同时创建。
为什么要存闭包?
是为了防止其释放后, 导致自身函数运行时, 找不到对应的变量资源 而 运行失败!
理解:
闭包 表达的是函数作用域的一种状态, 被别人存储在 scopes 里了
类似 妻子/丈夫 这种称呼, 代表一个人的一种状态
<script>
// 设定: 函数运行时产生的内存会在函数执行完毕后自动销毁, 节省内存
// 除非 把变量存放在全局对象window, 因为window永存!
function displayName() {
var name = 'mike'
var x = function () {
console.log('name:', name)
}
return x
}
// show 中存储的是 displayName() 函数中声明的变量x
// 所以x函数不会释放!
var show = displayName()
// 这里能打印出 name, 就说明 name 一定被存储了
show()
console.log(window)
//scopes: 作用域 们 -- 存放函数声明时所在的作用域链 中的作用域
//closure: 闭包 -- 封闭的包; 函数作用域生成的对象
</script>
闭包的缺点:
不可避免的消耗更多的内存
闭包的原则:
<script>
function x() {
var a = 10, b = 20
function y() {
var b = 30, c = 40
function z() {
var d = 50
// 使用了 a b c d 4个变量
// 这些变量都属于哪些作用域?
console.log(a, b, c, d);
}
// cdi: direct直接输出. 以对象的方式打印函数
// log: 按照一定的规则对输出内容进行美化, 函数会以字符串模式打印
console.dir(z)
}
y()
}
x()
</script>