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.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM