请看以下代码在输出台的输出情况
答案是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.