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) 收藏 举报
浙公网安备 33010602011771号