闭包的问题,为什么两个函数返回结果不想等

闭包的问题,为什么两个函数返回结果不想等

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>闭包</title>
</head>
<body>
    <script>
        function a() {
            var n = 999;
            nAdd = function() {
                n = n + 1;
            }
            function b(str) {
                console.log(str+':'+n);
            }
            return b;
        }

        var test1 = a();
        var test2 = a();
        nAdd();
        test1('test1'); // 999
        test2('test2'); //1000
    </script>
</body>
</html>

为什么不是两个都1000,

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
小于飞飞 2018-07-23 09:47:56

http://img1.sycdn.imooc.com//climg/5b55325000010d8003090142.jpg

  1. 注意执行test1 =a() ,相当于 函数 内部执行了一遍。n=999 , nAdd 函数定义,所以 test1('test1') 输出结果 999

  2. 执行test2 =a() ,相当于函数内部 重新 执行了一遍。n=999 , nAdd 函数定义。然后执行nAdd(); ,即执行了n = n + 1 ,n=1000 ,在执行 test2('test2')  ,结果为1000

如解答你的疑惑,欢迎采纳,祝学习愉快。

卡布琦诺 2018-04-08 17:48:40

这是因为当你调用var test1 = a();的时候,相当于调用的是var test1 = b();因为function a() {}这个函数实际上是 return b;返回的是b,因此执行的是

 function b(str) {
                console.log(str+':'+n);
 }

即999

但是当你调用var test2 = a(); nAdd();的时候,相当于将nAdd();赋给a(),即调用的函数是

nAdd = function() {
    n = n + 1;
}

有因为声明了 var n = 999; 那么n = n + 1;之后就是1000

希望可以帮到你~

  • 提问者 Coolyang_ #1
    没明白,这里test1和test2都是一样的,它们都是b(),在b的作用域中n为999,但是执行nAdd()后,b作用域里的n应该变成1000了,那为什么test1()结果是999,而test2是1000
    2018-04-08 18:04:32
  • 卡布琦诺 回复 提问者 Coolyang_ #2
    你可以改变nAdd()的调用位置,将nAdd()放在var test1 = a();后面,这个时候test1输出的就是1000,建议你再仔细听一下课程,在课程中老师对闭包的作用域的以及嵌套函数讲解的是很详细的哦~
    2018-04-08 18:08:03
  • 为什么调用nAdd()之后只会影响test2中的n,而test1中的n没变化?
    2018-07-20 19:25:00
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
组件化思想开发电商网页 18版
  • 参与学习           人
  • 提交作业       467    份
  • 解答问题       4826    个

本路径带你通过系统学习HTML5、JavaScript、jQuery的进阶知识,不仅如此,还会学习如何利用组件化的思想来开发网页,知识点+案例,使得所学可以更好的得到实践。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师