闭包简介
闭包是指有权访问另一个函数作用域中的变量的函数。
创建闭包的常见方式,就是在一个函数内部创建另一个函数。
变量的作用域
变量的作用域分为:全局变量 和 局部变量
(一)、全局变量和局部变量代码所示
|
|
以上代码共涉及3个执行变量:全局变量、changeColor()的局部环境和swapColors()的局部环境。
全局环境中有一个变量color和一个函数changeColor()。
changeColor()的局部环境中有一个变量anotherColor和一个函数swapColors();并可以访问全局环境中的变量color。
swapColors()的局部环境中有一个变量tempColor;该变量只能在这个swapColors()的局部环境中访问,然而可以访问其他两个环境中(父执行环境)的所有变量。
内部环境可以通过作用域访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。
(二)、声明变量
|
|
如果初始化变量时没有使用var声明,该变量会自动被添加到全局环境。
(三)、查询标识符
|
|
如果局部环境中存在着同名标识符,就不会使用位于父环境中的标识符。也就是说任何位于局部变量color的声明之后的代码,如果不使用window.color都无法访问全局color变量。
以下是来自阮一峰总结
闭包的概念
1. 闭包就是能够读取其他函数内部变量的函数。
2. 定义在一个函数内部的函数。
闭包的用途
- 可以读取函数内部的变量
- 可以让这些变量的值始终保持在内存中。
使用闭包的注意点
- 由于闭包会使得函数中的变量都被保存在内存中,
内存消耗很大
,所以不能滥用闭包,否则会造成网页的性能问题
,在Ie中可能导致内存泄露
。 解决方法是,在退出函数之前,将不使用的局部变量全部删除。- 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当做对象(object)使用,把闭包当作它的公用方法(public method),把内部变量当作它的私有属性(pricate value),这时不要随便改变父函数内部变量的值。