日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

javascript中闭包的一些理解

發布時間:2025/7/14 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javascript中闭包的一些理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

閉包是javascript中繞不開的話題,關于閉包的一些概念和應用,這方面資料比較多,在此就不再贅述。眾所周知,閉包的一個作用就是 讓一些變量始終保持在內存中 ,在此我用一些實際代碼對這句話作進一步的理解。

demo1:function closure(){var n = 0;function test() {console.log(++n);}test() test() }closure(); //輸出1,2(這個很好理解,不多說) demo2:function test(){var i=0;return function(){console.log(i++);}}var fn = test();fn(); //輸出0fn(); //輸出1

上述代碼中,fn就是執行函數test()返回的匿名函數。由于fn又是一個全局變量,生命周期一直存在,且這個匿名函數引用了父函數test里面的一個局部變量,所以變量i的狀態會被一直保存.

demo3:function test(){var i=0;return function(){console.log(i++);}}test()(); //輸出0test()(); //輸出0

上述代碼中,執行test()返回的是其內部的匿名函數,但是執行完test()()以后,該匿名函數的生命周期已經結束,所以變量i的狀態沒有得到保存。

最近在簡書上讀到一篇有趣的文章,其中一些代碼如下:

for (var i = 0; i < 5; i++) {setTimeout((function(i) {console.log(i);})(i), i * 1000); } //輸出0,1,2,3,4

上述代碼中有一個setTimeout()函數,其使用格式為setTimeout(func,time),意思是至少過time時間后,執行func。有了這樣的認識后,我們可以把func等價成:
(function(i){console.log(i)})(i)這個自執行函數。所以這個事情分兩步,首先每次循環自執行函數肯定會立即執行一次,會依次輸出1,2,3,4。其次,每過time時間,執行一次func,但是在上述代碼中,func等價于一個立即執行函數,沒有返回值,故什么也不會做。
如果把上述代碼改成這樣:

for (var i = 0; i < 5; i++) {var j=7;setTimeout((function(i) {console.log(i);return function(){console.info(j++);}})(i), i * 1000); }

上述代碼會依次輸出0,1,2,3,4, 7,8,9,10,11(結合這個例子理解上一個問題,就容易多了)

如果把上面的代碼改成這樣呢?

for (var i = 0; i < 5; i++) {setTimeout(function() {console.log(i);}, i * 1000); }

運行上面的代碼會輸出5個5(這一點現在可以理解了吧),有人不解的是為什么是每隔一秒輸出5而不是隔五秒輸出5。setTimeout(func,time)這個函數延遲執行的只是func里面的動作,而time的值是不存在延遲的。上面執行for循環,相當于:setTimeout(func,1000),setTimeout(func,2000) .... 第一次setTimeout執行的時候等了一秒(準確地說,至少要等一秒),第二次setTimeout執行的時候等2秒,但是前面第一次執行的setTimeout函數時,已經等了一秒,所以只需再等一秒就可以立即執行了。在這里,需要弄明白的是,setTimeout函數延遲執行的時間,起點是從time開始賦值的時候計算的,不是從上一個setTimeout函數執行完開始算的。

總結

以上是生活随笔為你收集整理的javascript中闭包的一些理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。