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()(); //2
box()(); //2
var c=box();
c(); //2
c(); //3
为什么一个是2 2,一个是2,3
你都说了是闭包问题了………
第一个里面重置了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
就跟第一个方式相同
执行第一句 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
10 回答11.7k 阅读
2 回答3.2k 阅读✓ 已解决
2 回答4.3k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
4 回答2.5k 阅读✓ 已解决
5 回答3.8k 阅读