闭包 Closure
前言
变量作用域
要理解闭包,就要理解javascript特殊的变量作用域
变量的作用域无非就是两种:全局变量,局部变量
javascript的特殊之处就在于:函数内部可以访问到全局变量,但在函数外无法读取到函数的局部变量
注意:在函数内部声明变量的时候,要用var关键字。如果不用的话,实际上创建的是全局变量
什么是闭包
【函数】和【函数内部能访问到的局部变量】(也叫环境)的总和叫闭包
就这么简单!
我们常见的闭包的实现方式是函数内嵌套函数 然后 runturn一个函数
function foo(){
var local = 1
function bar(){
local++
return local
}
return bar
}
var func = foo()
func()
这里面确实有闭包,local变量和bar函数就组成了一个闭包(Closuse)
为什么需要嵌套函数呢?
是因为需要局部变量,才需要把local,放到一个函数里。
如果不把local放到函数里,local就是一个全局变量了,就达不到使用闭包的目的——隐藏变量
所以嵌套函数只是为了制造局部变量,跟闭包无关
为什么要返回函数 (return bar)
因为如果不return bar ,你就无法使用这个闭包。把return bar 改成 window.bar = bar 也是一样的。只要外面能访问到这个函数就行了
所以return bar 只是为了bar ,能被使用,和闭包无关
闭包的作用是什么
闭包常常用来【间接访问变量】换句话说【隐藏变量】
闭包可以用在很多地方,但它最大的用处有两个:
- 可以读取到函数内部的值
- 函数中的这些变量的值存在内存中
使用闭包的注意点
- 使用闭包会使函数中的变量存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄漏。
解决方法,在退出函数前,将不能使用的局部变量删除
内存泄漏:指你用不到的变量还占据着内存空间,不能再次利用起来
关于IE:IE 有bug,在我们使用完闭包之后,依然回收不了里面引用变量的值
- 闭包会在父函数外部,改变函数内部变量的值。所以把父函数当作对象object 使用,把内部函数作为公共方法 public method,把内部函数的变量,当作私有属性 private value,这时一定小心,不要随意改变父函数内部变量的值。