js闭包面试题

请看以下代码在输出台的输出情况

 

 

 

 

 

 

 

答案是4400,4401,4399,4400

 首先,test函数做了什么?test在自己的函数作用域内创建一个变量n,以及一个函数add,这时add就作为一个闭包,它可以在外部访问到test内部的变量n,并对其进行加法。然后test返回一个对象,这个对象有一个n变量以及一个add函数,n变量是test内部的变量n的一个缓存,而add则是test内部add的一个引用。

然后,我们执行了两次test,并把结果返回给两个变量result,result2,这两个变量所拥有的匿名对象是没有任何关联的,因此result2.add()执行的时候,和result.add()执行的情况一样,返回4400。然后result.add()再次执行,返回4401。需要注意的是,这里result.add()对变量n的改变,并不是对匿名对象内部的那个n进行改变,而是test内部的那个n,前面说过,add仅是对test内部函数的一个引用,它操作的n是和它次作用域相关的n。因此,当我们调用输出result.n的时候,这时候才是访问对象内部的n变量,返回的是未被操作的4399.

 

posted @ 2018-09-06 15:25  某个润滑君  阅读(3368)  评论(0编辑  收藏  举报