这里为什么是变量累加?

            function a(){
                var num=1;
                return function(){
                    return num++;
                }
            }
            
            var b= a();
            
            console.log(b());
            console.log(b());
            console.log(b());
            console.log(b());
            console.log(b());
            

这段代码输出的结果是:1,2,3,4,5
为什么是累加了呢?

阅读 3.9k
8 个回答

这里牵扯到了闭包
函数a执行后的返回结果是一个函数,所以变量b实际上指向的是

function(){
   return num++;
}

这个函数中的num访问的是函数a中的num变量b是一个全局变量,不会被垃圾回收掉,因为需要访问num,所以函数a的活动对象(AO)也就不会被释放掉,始终存在,这就是num可以一直累加的原因,每一次调用变量b,都会将函数a中的num加1

典型的闭包!

我就随便说说的,怎么修改掉啊

b 是闭包函数,每次执行都读取相同的 a 作用域下的 num。

这是个闭包吧,每次执行b()实际上是执行了里面那个function,所以num并没有每次都置1

这是一个经典的js的闭包问题。先简单的回答一下,是因为num1 是在执行b=a()生成的,执行完毕之后,由于num1在b中被引用
所以变量对象没有释放,之后每次执行b(),调用的都是同一个变量对象,闭包的问题不是三两句话就能讲清楚的,有兴趣可以看下我之前写的闭包详解点击前往,可能会对你有帮助

这个是一个最基本的闭包结构,你上面声明了一个a方法,在下面把a方法放在了b变量里面,所以b就成为了一个实例的a方法,每当你调用b的时候,都会返回并执行里面的方法

return function(){
    return num++;
}

里面的方法调用的是局部变量num,并进行累加。所以每次通过b的调用,执行的是里面的方法,访问的是b的局部变量,从而num每次进行了累加。这样做事防止全局污染,但会让局部变量一直在内存里存在,建议不要过度使用闭包。

看下这篇文章吧,看过后你的这个问题自然而然的就知道了。

闭包整理

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏