首页 > 一个js的闭包问题?

一个js的闭包问题?

function box(){
    var a=1;
    return function(){
        a++;
        alert(a);
    }
}
box()();        //2
box()();        //2
var c=box();
c();            //2
c();            //3

为什么一个是2 2,一个是2,3


function box(){
    var a = 1;
    return function(){
        a++;
        alert(a);
    }
}

// 调用了两次 box(),返回了两个闭包。闭包中的 a 不是同一个。
box()(); // 调用 box(),返回闭包。a = 1, a++ 结果 a 值为 2 。
box()(); // 同上。

// 调用一次 box(),返回了一个闭包,调用 c() 时的 a 是同一个。
var c = box(); // 返回闭包,a 值不销毁。
c(); // a 值 +1,2。
c(); // a 值再 +1,3。

1.俩闭包
2.一个闭包


c 方法访问到的是同一个 a,就酱


执行第一句 box()()
box 创建了一个 a 然后返回了一个新的函数,这个函数给 a 加了 1,然后执行了一下这个函数。

执行第二句 box()()
box 又创建了一个 a 然后又返回了一个新的函数,这个函数给这个新的 a 加了 1,然后执行了一下这个新的函数。

这两次创建的 a 没任何关系,返回的函数也没任何关系。

执行 var c = box()
定义了变量 c 为执行 box 后返回的那个新函数,这个新返回的函数 c 给 box 再次创建的那个新的 a 进行加 1.

执行了两次 c():给最后创建的那个 a 加了两次,第一次变成 2,第二次变成 3.

执行的这两次都是执行同一个函数,改变同一个 a。


闭包


差不多理解了这个了,可能有理解错误的地方,求轻喷。

这个可以从执行环境的角度来理解。在js里面,当执行流进入一个函数的时候(或者说当开始执行一个函数的时候),函数的执行环境会被推入到一个环境栈里面,函数执行结束后又会将该环境弹出。

这样前两个box()()实际上每次执行的时候,函数环境都被推入到栈里面,结束后又会被弹出,所以两个互不影响,都是2。
但是c=box()的时候,因为c一直保持着box()的执行,所以执行环境没有被弹出,后面两个c()就都在同一个执行环境里面了,所以是同一个a,就变成了2和3.

问了师兄,他的解释是每个函数的作用域都是独一无二的,函数执行完后里面的东西都会清空,所以box()()执行两次后都是2,而c,即box(),实际是一直引用着box里面的a变量,所以一直不会被清空,大概类似于:
var a=1;
function c(){
a++;
alert(a);
}
c(); //2
c(); //3


第一次类似如下:
var b = box();
b();
var b1 = box();
b1();
结果正如输出


你都说了是闭包问题了………
第一个里面重置了a~

第一个执行流程是
var a=1;
a++;
alert(a);

var a=1;
a++;
alert(a);

第二个执行流程是
var a=1;
a++;
alert(a);

a++;
alert(a);

==================

box()();//2
box()();//2
这种执行方式,先执行了box();
再执行box()里面的function
因此在每次执行都会有

var c=box();
c();//2
c();//3
这种方式。只在第一次给c赋值的时候执行了一次box() //c=box()
之后都只执行了box()里面的函数
也就是说,如果你这么写

var c=box();
c();//2
var c=box();
c();//2

就跟第一个方式相同

【热门文章】
【热门文章】