請看以下代碼在輸出台的輸出情況
答案是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.