声明全局变量i和局部变量j:
var i = 0; function foo(){ i+=1; var j = 0; j+=1;
console.log('j='+j); } foo(); //foo(); console.log('i='+i);
在函数中声明全局变量i和局部变量j:
function foo(){ i = 0;//函数中的i由于没有声明,将提升为全局变量 i+=1; var j = 0; j+=1;
console.log('j='+j); } foo(); //foo(); console.log('i='+i);
当我们先注释掉第二个foo();执行这两段代码,会在控制台打印j=1;i=1,当去掉注释再次执行,我们发现打印台结果为j=1;j=1;i=2。由此说明全局变量i在被调用后并没有被gc垃圾处理程序回收,而局部变量j在每一次被调用后都被回收,下一次再被重新声明赋值再回收销毁。而闭包所达到的其中一个效果就是让局部变量被调用后可以不被回收,甚至从某种程度来说可以把局部变量拿到全局来使用(其实可以参考下java中一个Object,里面有private私有属性,需要在外面拿到这个私有属性需要public的get方法,而现在就是需要在JS中写一个这样的get方法)。
最后的效果:
var foo = (function(){ var i = 0; return function(){//相当于get方法 return i+=1; } })(); foo(); foo();