理解js中的闭包

来源:互联网 发布:淘宝的流量钱包自动领 编辑:程序博客网 时间:2024/04/26 02:04

同上篇理解原型一样,我也不想描述太多书本上的概念,闭包可能比原型更难理解,如果看概念,可能你看几个月也不能理解。

如何理解闭包?

首先,我认为,闭包的作用,简单的说,就是保存函数的局部变量。这该如何理解呢?
我觉得,这要分两点来解释:
1.保存局部变量的问题。java中的局部变量,是用的堆栈模型,所以在java里,局部变量,是不能在作用域外部访问到的,而js中则不同,js中是使用作用域链这个模型去保存变量的,具体啥叫作用域链,笔者也解释不清楚,以前看Js权威指南时候看过,但是长时间不用,不去翻这个概念,现在已经忘得一干二净,只知道作用域链这个名词了,但是不影响闭包概念的理解。
2.如何访问函数的局部变量。
function counter () {        var i = 0;    }

尝试在外面访问counter这个对象,

可以看到,直接访问是不行的。那么试试下面这段代码:
function counter () {        var i = 0;        return function () {            return i;        }    }
尝试在浏览器上这么访问:
这样就可以访问到局部变量i了,此时counter已经是一个闭包了,是不是很神奇!

闭包的作用

会写闭包,但是不知道用在什么地方,不知道咋用,等于没有理解。
1.闭包可以模拟私有方法,限制代码的访问。
function counter () {        var i = 0;        function a() {            i++;        }        return function () {            return i;        }    }

比如a方法,外部是访问不到的,可以自己试试。
2.管理全局命名空间,避免污染全局作用域。
闭包的主要作用就是上面2个,但是,这2个作用,我们怎么用到实际的开发当中呢??答案,写js插件。笔者在做面试官的时候,当我问闭包的问题时,只要他能回答出来写插件的时候用,我觉得他算是理解闭包了。



0 0
原创粉丝点击