关于闭包必问的两个问题:
- 神魔是
闭包
? 闭包
的作用是神魔?
神魔是闭包?
var local = '变量'
function foo(){
console.log(local)
}
假设上面三行代码在一个立即执行函数
中。
三行代码中,有一个局部变量local
,有一个函数foo
,foo
里面可以访问到local
变量。那么这就是一个闭包
。
函数 和 函数内部能访问到的变量 (也叫环境) 的总和,就是一个闭包
。
大部分的闭包
都是以函数套函数
的形式来进行展示的。
比如这个样子:
function foo(){
var local = 1
function bar(){
local ++
return local
}
return bar
}
var func = foo()
func()
local
变量和bar
函数就组成了一个闭包。
函数套函数的作用是啥呢?
函数套函数
就是为了故意制造出一个局部的变量
local
,如果不把 local
放在一个函数里面,local
就成了一个全局的变量
,就没有办法做到 闭包的作用(隐藏一个变量)
return bar的作用是啥?
return bar
就是为了让你能够使用这个闭包。为了让外面能够访问到这个bar
函数而已。
闭包
的作用是神魔?
其实从上面的例子我们已经能够看出来,闭包就是制造一个局部变量
,只给外部提供一个可以操作这个变量的方法
。
比如我们需要发优惠券给用户,我们发的优惠券都是xx-10
这种类型的,有人如果不小心改错了数据,将这个xx
改成了负数,用户总不能用了优惠券越用越亏吧。
所以我们不允许别人操作这个数据,只提供给他一个方法。
!function(){
var xx =20
window.加1块钱 = function(){
xx += 1
}
window.减1块钱 = function(){
xx -= 1
}
}
那么我们的这个方法就可以调用 window.加1块钱
或者减1块钱
微调优惠券的优惠力度,而不至于直接改数据。
这下又形成了两个闭包:
- xx 和 加1块钱的函数
- xx和减一块钱的函数
闭包和作用域
var local = '变量'
function foo(){
console.log(local)
} //在一个立即执行函数中
foo
的函数内部可以使用foo
函数外部的变量,就符合了闭包的定义。
闭包是 JavaScript
一个非常重要的特性,这意味着当前作用域
总是能够访问外部作用域
中的变量。因为 函数 是 JavaScript
中唯一拥有自身作用域
的结构,因此闭包
的创建依赖于函数。
闭包会造成内存泄漏吗?
内存泄露
是指你用不到(访问不到)的变量,依然占据
着内存空间,不能被再次利用起来。
但是闭包里面的变量是我们需要使用的变量,就不能说是内存泄漏
。
IE浏览器
在我们使用完闭包之后,依然回收不了闭包里面引用的变量。所以会导致这个bug。
所以这其实是IE
的问题。
文章参考 :
[1] 方应杭 js中的闭包是什么?
[2] JavaScript秘密花园
如果对你有帮助的话,请点个👍吧!我会继续分享更多文章的~
本文使用 mdnice 排版