bugu1986 发表于 2013-1-22 22:55:08

闭包之我见

说点功利的,如果你面试的时候跟人家大谈javascript和函数话编程,然后人家让你解释闭包。结果如果说不透彻甚至说不出。那就尴尬了,这次面试基本会挂掉。

   关于闭包我自己也不是很明白,权当自己记录下来理清条例的,先上例子吧。
运行环境是V8的shell,前面提到了是chrome的js引擎。
var Bugu = new Object();Bugu.test = (function(){var upvalue = 0;return function(){upvalue ++;print(upvalue);}})();Bugu.test();Bugu.test();
bugu@bugu-love:~/javascript$ ./d8 closure.js 12
这个很好理解的,Bugu.test 后面的是应用了声明即调用的技巧,实际上Bugu.test指向的是return function(){upvalue ++;print(upvalue);}
这个闭包,为什么是闭包呢,因为他其实返回了自己并赋值给Bugu.test ,现在外部变量没有被重新赋值或删除,所以外部变量的存在需要这个匿名函数的支持,所以匿名函数没有被gc,而匿名函数又包含了upvalue变量,导致上层的函数也不能被gc,应为需要这个变量嘛。

所以大家都在这里,不生不灭的。

第一次调用Bugu.test() 。upvalue++ 变成 1 ,输出 1;
第二次调用Bugu.test() ,闭包还在,upvalue也在,upvalue++ 变成 2 ,输出 2;

这个很简单的例子,下面说个复杂的。
var Bugu = new Object();Bugu.test = (function(){var upvalue = 0;return function(){this. u = upvalue ++;print('init');this.getValue = function(){return this.u;}}})();var t1 = new Bugu.test();var t2 = new Bugu.test();print(t1.getValue());print(t2.getValue());

bugu@bugu-love:~/javascript$ ./d8 hello.js initinit01

这个就相当于创建了两个对象,但是跟上面的例子同理,那么创建第一个对象的时候,uplevel是0,赋值给u。创建第二个对象的时候,闭包还在,没有被gc,所以这时候uplevel++,是1,赋值给u。大结局。
页: [1]
查看完整版本: 闭包之我见