JavaScript闭包

2016-10-06 qiangdada 开源中国

闭包它绝对算的上是JavaScript中的一大难点,当然也是一大重点。N多高级程序都需要或者必须用到闭包才能得以实现。

1、变量作用域
理解闭包很重要的一点就是需要先理解JavaScript特殊的变量作用域。

而变量作用域无非两种形式,全局变量和局部变量。而在JavaScript中,所有的函数它都可以在其内部访问到全局变量。

而在函数外部也无法读取函数内的局部变量。

当然在定义变量的时候,一定要记住加上var关键字,不然,JavaScript会默认你定义了一个全局变量。

2、函数外部访问局部变量
很多时候我们需要在一个函数中去访问另外一个函数内部的局部变量,可是上面又说了一个函数内部的局部变量是不允许被其他函数访问的。怎么办呢?

那我们就需要在函数内部在定义一个函数,这样就可以在其内部函数中访问到它内部的局部变量了。上代码理解。

而上面代码中的test2就是一个闭包,它是一种能够读取其他函数内部变量的函数,或者直接理解为定义在一个函数内部的函数。
3、闭包的用途

闭包可以用在很多地方。但它最大的用处有两点。第一点是以上提到的,访问其他函数内部的局部变量。还有一个很重要的用途则是让这些变量始终保存在内存中。不多解释,直接看代码理解。

4、闭包使用中需注意的问题

1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象使用,把闭包当作它的公用方法,把内部变量当作它的私有属性,这时一定要小心,不要随便改变父函数内部变量的值。
5、练习思考题

当你可以理解以下两段代码运行结果时,那么恭喜你,你已经理解了闭包的运行机制了。

var name = "the window";
var object = {name:"my object",getNmaeFunc:function(){return function(){return this.name;}}}
undefined
alert(object.getNmaeFunc()())
undefined
var name = "the window";
var object = {name:"my object",getNmaeFunc:function(){var that = this;return function(){return this.name;}}}
undefined
alert(object.getNmaeFunc()())
undefined
var name = "the window";
var object = {name:"my object",getNmaeFunc:function(){var that = this;return function(){return that.name;}}}
undefined
alert(object.getNmaeFunc()())
undefined

http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

 

posted @ 2016-10-06 23:16  chenxj  阅读(113)  评论(0)    收藏  举报