js中闭包的理解

在针对闭包概念进行解释之前,我们先从一个程序进行入手

//通过一个返回函数将上级函数中的局部变量保存,而不会被垃圾回收机制回收,或者说被保存的变量时一个全局变量
            //1、从函数外部读取局部变量,所以通过外部即可改变函数内部的值
            //2、将变量悠久保存在函数内部,导致内存泄露问题
            function first(x) {
                var temp = x;
                return function(x) {
                    if (x > 100) {
                        return temp;
                    }
                    temp = x;
                    
                }
            }
            
            
            var second = first(50);
            
            second(10);
            var result = second(200);
            console.log(result);

上面代码中temp是一个局部变量,现在有两个问题需要我们思考

  1、在first函数的外部能不能去访问temp这个变量?

  2、temp这个变量能不能像全局变量一样永远保存在内存中,在需要时被访问?

现在我们首先回答第一个问题:

  例子中通过return 返回一个内部匿名函数,这个匿名函数中使用了这个temp局部变量,当我们执行first函数时,返回该匿名函数,那么该匿名函数就是一个连接first内部和first外部的桥梁,我们可以访问该

  temp变量。

现在我们来回答第二个问题:

  js中同java一样存在垃圾回收,那个局部变量在被使用后,就会被垃圾回收,如果避免局部变量被垃圾回收,需要在其他函数中使用该变量,因为函数是一个永久体,这种变量驻留在该函数中,只要该函数不销毁,那么这个变量也不会被销毁,这样它就想全局变量一样永远贮存在内存中。

另外还要提高一点就是 js类面向对象设计,申明的伪类,私有变量都是局部变量,而set,get方法就使用了闭包的这种方式,就这些私有变量封存,只有通过set,get方法才能访问该私有变量,所以大家在后期学习

js类面向对象设计时,以闭包的方式去理解,就不会太难了。

其实个人对于闭包的理解:通过一个内部函数,将上级函数的局部变量,驻留在内存中,并可以被外部访问。

 

posted on 2015-11-08 16:44  zhaojunyang  阅读(187)  评论(0)    收藏  举报

导航