javascript闭包浅谈
2013-03-13 11:15
375 查看
一般要跳过闭包的创建过程,直接进入闭包的概念,是很难的,所以,先来看一个例子:
function a(){
var a=1;
function b(){alert(a);}
}
函数b嵌套于函数a内部,因此a所有的变量对于b都是可见的,反过来则不行,这就是javascript语言特有的“链式作用域”结构。
既然函数b可以读取函数a的值,那么把函数b作为返回值,我们在a()外部就可以读取a()内部的变量了。即以内部嵌套的函数作为返回值,即可获取局部变量。这个内嵌的函数即为闭包。我的理解是,闭包就是能够读取其他函数内部变量的函数。所以,在本质上,闭包是将函数内部和函数外部连接起来的一座桥梁。
闭包最大的作用有两个,一个是如上所说的获取函数内部变量,另一个则是使变量的值始终保存在内存中,由于闭包会使得变量始终保存在内存中,内存消耗很大,在IE中就会造成内存泄露,因此使用闭包还是需要慎重,在退出函数前,将不使用的局部变量全部删除。
闭包会在父函数外部改变父函数内部变量的值,如果把父函数当做object啦使用,把闭包当做它的公用方法,把内部变量当做它的私有属性,这时就一定要小心,不要随便改变父函数内部变量的值。
当内部函数在定义了它的外部作用域被引用时,就创建了该内部函数的闭包,如果内部函数有引用外部函数的变量,当外部函数调用完毕,这些变量不会被释放,因为闭包需要他们。
其实通俗的来说,javascript中所有的函数都是闭包,只不过嵌套的闭包功能更加强大。
function a(){
var a=1;
function b(){alert(a);}
}
函数b嵌套于函数a内部,因此a所有的变量对于b都是可见的,反过来则不行,这就是javascript语言特有的“链式作用域”结构。
既然函数b可以读取函数a的值,那么把函数b作为返回值,我们在a()外部就可以读取a()内部的变量了。即以内部嵌套的函数作为返回值,即可获取局部变量。这个内嵌的函数即为闭包。我的理解是,闭包就是能够读取其他函数内部变量的函数。所以,在本质上,闭包是将函数内部和函数外部连接起来的一座桥梁。
闭包最大的作用有两个,一个是如上所说的获取函数内部变量,另一个则是使变量的值始终保存在内存中,由于闭包会使得变量始终保存在内存中,内存消耗很大,在IE中就会造成内存泄露,因此使用闭包还是需要慎重,在退出函数前,将不使用的局部变量全部删除。
闭包会在父函数外部改变父函数内部变量的值,如果把父函数当做object啦使用,把闭包当做它的公用方法,把内部变量当做它的私有属性,这时就一定要小心,不要随便改变父函数内部变量的值。
当内部函数在定义了它的外部作用域被引用时,就创建了该内部函数的闭包,如果内部函数有引用外部函数的变量,当外部函数调用完毕,这些变量不会被释放,因为闭包需要他们。
其实通俗的来说,javascript中所有的函数都是闭包,只不过嵌套的闭包功能更加强大。
相关文章推荐
- 浅谈javascript闭包(closure)
- JavaScript闭包浅谈
- 跟据一段代码浅谈Javascript闭包
- 浅谈javascript闭包
- 根据一段代码浅谈Javascript闭包
- 浅谈我对Javascript闭包的认识
- 浅谈javascript闭包的重要性
- 根据一段代码浅谈Javascript闭包
- 浅谈三层结构与MVC模式的区别
- 浅谈工程师之系统观念
- Cocos2dx游戏开发浅谈之场景
- 浅谈数据结构-Boyer-Moore算法
- 浅谈为什么Git没有取代SVN
- 浅谈PipelineDB系列一: Stream数据是如何写到Continuous View中的
- 浅谈企业软件架构(1)
- 浅谈简约四策略(二)
- 浅谈Sendmessage 和Postmessage
- 浅谈ANR及如何分析解决ANR.1
- JavaScript中toStirng()与Object.prototype.toString.call()方法浅谈
- 【转】浅谈Node.js单线程模型