javascript - 一个js的闭包问题?
阿神
阿神 2017-04-11 12:12:58
[JavaScript讨论组]
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

阿神
阿神

闭关修行中......

全部回复(8)
黄舟

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

这个可以从执行环境的角度来理解。在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

PHP中文网

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

PHP中文网
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。
ringa_lee

你都说了是闭包问题了………
第一个里面重置了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。

高洛峰

1.俩闭包
2.一个闭包

高洛峰

闭包

PHP中文网

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号