日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解JavaScript作用域 閉包

瀏覽:218日期:2023-10-19 15:57:58

JavaScript閉包,是JS開發工程師必須深入了解的知識。3月份自己曾撰寫博客《JavaScript閉包》,博客中只是簡單闡述了閉包的工作過程和列舉了幾個示例,并沒有去刨根問底,將其弄明白!

現在隨著對JavaScript更深入的了解,也剛讀完《你不知道的JavaScript(上卷)》這本書,所以乘機整理下,從底層和原理上去刨一下。

JavaScript并不具有動態作用域,它只有詞法作用域。詞法作用域是在寫代碼或者說定義時確定的,而動態作用域是在運行時確定的。了解閉包前,首先我們得知道什么是詞法作用域(作用域是由書寫代碼時函數聲明的位置來決定的)。

一、何為閉包

示例1:

function foo(){var a = 2;function bar(){console.log(a);}return bar;}var baz = foo();bzz(); //2

在foo()執行后,通常認為垃圾回收機制會將foo()的整個內部作用域都被銷毀;而閉包可以阻止這樣事情發生,讓其內部作用域依然存在。因為bar()處于foo()內部,它擁有涵蓋foo()作用域的閉包,使得該作用域能夠一直存活,以供bar()在之后任何時間進行引用。

bar()依然持有對該作用域的引用,而這個引用就叫作閉包。

簡言之:當函數可以記住并訪問所在的詞法作用域,即使函數是在當前詞法作用域之外執行,這時就產生了閉包。

示例2:

無論使用何種方式對函數類型的值進行傳遞,當函數在別處被調用時都可以觀察到閉包。

function foo(){var a = 2;function baz(){console.log(a);}bar(baz);}function bar(fn){fn();// 這就是閉包}

示例3:

將一個內部函數(timer)傳遞給setTimeout。timer具有涵蓋wait()作用域的閉包,保有對變量message的引用。

wait()執行1000毫秒后,它的作用域并不會消失,timer依然保有wait()作用域的閉包。

function wait(message){setTimeout( function timer(){console.log(message);},1000);}wait('Hello,ligang');

示例4:

下述activator()具有涵蓋setupBot()作用域的閉包!

function setupBot(name, selector){$(selector).click(function activator(){console.log('Activating: '+ name);});}setupBot('Closure Bot 1', '#bot_1');setupBot('Closure Bot 2', '#bot_2');

二、循環和閉包

for(var i=1; i<=5; i++){setTimeout(function timer(){console.log(i);}, i*1000);}// 期望:每秒一次的頻率輸出1~5// 結果:每秒一次的頻率輸出五次6

先解釋一下:“i*1000”,5個定時分別在1s、2s、3s、4s、5s后執行,并不是1s、3s、6s、10s、15s。也就是頻率為1s,不是每次間隔增加1s。如果去掉i寫成“1000”,會在for執行完1s后直接輸出五次6。

回調函數在循環結束后才被執行,因此輸出的是循環終止條件是i值。事實上,當定時器運行時即使每個迭代中執行的是setTimeout(..., 0),所有的回調函數依然是在循環結束后才被執行。

根據作用域的工作原理,盡管五個函數是在各個迭代中分別定義的,但是它們都被封閉在一個共享的全局作用域中,因此實際上只有一個i。

解決方案1:

for(var i=0; i<=5; i++){(function(j){setTimeout(function timer(){console.log(j);}, j*1000 );})(i);}// 結果:每秒一次的頻率輸出1~5

每個迭代都生成一個新的作用域,使得延遲函數的回調可以將新的作用封閉在每個迭代內部,每個迭代中都會含有一個具有正確值的變量供我們訪問。

解決方案2(ES6):

for(var i=0; i<=5; i++){let j = i;setTimeout(function timer(){console.log(j);}, j*1000 );}// 結果:每秒一次的頻率輸出1~5for(let i=0; i<=5; i++){setTimeout(function timer(){console.log(i);}, i*1000 );}// 結果:每秒一次的頻率輸出五次6

三、模塊

模塊需要具備兩個必要條件:

(1)必須有外部的封閉函數,該函數必須至少被調用一次(每次調用都會創建一個新的模塊實例)。

(2)封閉函數必須返回至少一個內部函數,這樣內部函數才能在私有作用域中形成閉包,并且可以訪問或者修改私有的狀態。

典型的模塊化:

function CoolMoudle(){var something = 'cool';var doSomething = function(){console.log(something);}return{doSomething: doSomething};}var foo = CoolMoudle();//如果不執行外部函數CoolMoudle(),內部作用域和閉包都無法創建foo.doSomething();//cool

單例模式:

var foo = (function CoolModule(id){function change(){// 修改公共APIpublicAPI.identify = identify2;}function identify1(){console.log(id);}function identify2(){console.log(id.toUpperCase());}var publicAPI = {change: change,identify: identify1};return publicAPI;})('foo module');foo.identify();//foo modulefoo.change();foo.identify(); //FOO MODULE

以上就是詳解JavaScript作用域 閉包的詳細內容,更多關于JavaScript作用域 閉包的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
se01亚洲视频 | 亚洲精品国产偷自在线观看| 日韩av电影一区| 丝袜美腿成人在线| 伊人国产精品| 国产日韩中文在线中文字幕| 精品少妇av| 在线精品一区二区| 亚洲精品亚洲人成在线观看| 日韩一区二区三区四区五区| 亚洲乱码一区| 伊人久久大香线蕉av不卡| 久久国产日韩欧美精品| 国产图片一区| 精品免费av一区二区三区| 久久久久国产精品一区二区| 婷婷综合成人| 国产日韩一区| 女生影院久久| 日韩精品一二三区| 日本不良网站在线观看| 久久亚洲在线| 国产一区福利| 99在线|亚洲一区二区| 成人啊v在线| 婷婷成人在线| 日韩一区二区免费看| 欧美一区成人| 亚洲精品一区二区在线看| 欧美日一区二区三区在线观看国产免| 都市激情国产精品| 婷婷亚洲精品| 7m精品国产导航在线| 99久久亚洲精品蜜臀| 欧美日韩一视频区二区| 日韩欧美1区| 国产精品精品| 国产一区二区三区四区大秀| 免费视频久久| 午夜久久av | 免费黄色成人| 国产精品中文字幕亚洲欧美| 蜜臀av免费一区二区三区| 久久爱www成人| 日韩综合一区二区三区| 亚洲精品a级片| 成人在线超碰| 国产日本精品| 国产偷自视频区视频一区二区| 国产一区二区三区不卡av| 国产精品一区二区三区www| 性欧美长视频| 亚洲五月婷婷| 欧美日韩视频免费观看| 日本va欧美va欧美va精品| 一区视频在线| 亚洲不卡系列| 麻豆网站免费在线观看| 国产麻豆精品| 久久国产乱子精品免费女| 首页国产欧美久久| 一区久久精品| 粉嫩av一区二区三区四区五区| av在线资源| 国产精品嫩草99av在线| 国产精品毛片一区二区三区| 欧美日韩黑人| 丝袜美腿亚洲色图| 蜜臀av一区二区三区| 亚洲一区二区网站| 国产精品66| 久久国产欧美| www.51av欧美视频| 蜜臀a∨国产成人精品| 欧美在线不卡| 国产精东传媒成人av电影| 婷婷综合五月| 精品中文字幕一区二区三区四区| 奇米狠狠一区二区三区| 国产精品蜜芽在线观看| 国产精品日本一区二区不卡视频| 视频一区中文| 久久精品一区| 人人精品久久| 国产精品入口久久| 精精国产xxxx视频在线野外| 亚洲一级黄色| 欧美午夜不卡影院在线观看完整版免费| 久久亚洲黄色| 国产精品av久久久久久麻豆网| 黄色av日韩| 亚洲欧美日韩精品一区二区 | 婷婷久久免费视频| 日韩在线观看中文字幕| 亚洲黄色网址| 亚洲激情国产| 国产粉嫩在线观看| 欧美日韩1区| 亚洲黄色在线| 亚洲精品在线影院| 国产激情精品一区二区三区| 亚洲视频二区| 亚洲高清不卡| 丁香婷婷久久| 人人精品久久| 久久高清免费观看| 久久久久中文| 韩日一区二区| 欧美久久香蕉| 91在线成人| 99视频一区| 日韩欧美一区免费| 久久精品国产999大香线蕉| 亚洲精品日韩久久| 亚洲在线观看| 国产一区二区三区不卡av| 国产日韩一区二区三区在线播放| 国产精品任我爽爆在线播放| 高清日韩欧美| 免费人成在线不卡| 久久精品电影| 欧美丝袜一区| 一级成人国产| 精精国产xxxx视频在线播放| 欧美激情五月| 免费日韩一区二区| 亚洲电影在线一区二区三区| 久久久夜夜夜| 国产综合亚洲精品一区二| 亚洲成人va| 999久久久亚洲| 欧美sss在线视频| 日韩欧美二区| 亚洲高清二区| 欧美日韩水蜜桃| 久久中文字幕av一区二区不卡| 一本大道色婷婷在线| 日韩黄色大片| 精品视频在线你懂得| 久久国产欧美| 久久国产中文字幕| 欧美中文字幕一区二区| 欧美理论视频| 视频精品一区| 久久中文在线| 麻豆视频在线看| 一区二区小说| 黄色在线一区| 国产精品久久久久蜜臀| 国产高清精品二区| 国产精品99久久免费| 国产精品大片| 日韩欧美看国产| 国产精品腿扒开做爽爽爽挤奶网站| 免费欧美一区| 在线日韩一区| 亚洲婷婷丁香| 国产欧美成人| 亚洲韩日在线| 国产伦理久久久久久妇女| 美女高潮久久久| 亚洲网站视频| 国产精品伦一区二区| 久久久夜精品| 国产午夜久久av| 天堂va蜜桃一区二区三区| 久久久久久久久成人| 精品视频国产| 亚洲精品综合| 亚洲69av| 久久国内精品视频| 92国产精品| 国产在线视频欧美一区| 日韩三区免费| 国产亚洲在线观看| 亚洲精品黄色| 久久精品国产99国产| 国产99精品一区| 婷婷五月色综合香五月| 美女高潮久久久| 亚洲高清毛片| 日韩欧美在线精品| 91日韩在线| 国产精品一区二区99| 日韩一区二区三区在线免费观看| 国产亚洲一区| 99成人在线视频| 日本综合视频| 亚洲精品极品| 欧美1区2区3区| 成人在线视频中文字幕| 高清一区二区三区| 国产精品密蕾丝视频下载| 国产乱码精品一区二区三区亚洲人 | 久久三级毛片| 国产成人久久| 亚洲欧洲高清| 高清日韩欧美| 99热免费精品| 毛片在线网站|