成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

詳解JavaScript作用域 閉包

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

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

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

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

一、何為閉包

示例1:

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

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

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

簡言之:當(dāng)函數(shù)可以記住并訪問所在的詞法作用域,即使函數(shù)是在當(dāng)前詞法作用域之外執(zhí)行,這時(shí)就產(chǎn)生了閉包。

示例2:

無論使用何種方式對函數(shù)類型的值進(jìn)行傳遞,當(dāng)函數(shù)在別處被調(diào)用時(shí)都可以觀察到閉包。

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

示例3:

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

wait()執(zhí)行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');

二、循環(huán)和閉包

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

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

回調(diào)函數(shù)在循環(huán)結(jié)束后才被執(zhí)行,因此輸出的是循環(huán)終止條件是i值。事實(shí)上,當(dāng)定時(shí)器運(yùn)行時(shí)即使每個(gè)迭代中執(zhí)行的是setTimeout(..., 0),所有的回調(diào)函數(shù)依然是在循環(huán)結(jié)束后才被執(zhí)行。

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

解決方案1:

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

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

解決方案2(ES6):

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

三、模塊

模塊需要具備兩個(gè)必要條件:

(1)必須有外部的封閉函數(shù),該函數(shù)必須至少被調(diào)用一次(每次調(diào)用都會創(chuàng)建一個(gè)新的模塊實(shí)例)。

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

典型的模塊化:

function CoolMoudle(){var something = 'cool';var doSomething = function(){console.log(something);}return{doSomething: doSomething};}var foo = CoolMoudle();//如果不執(zhí)行外部函數(shù)CoolMoudle(),內(nèi)部作用域和閉包都無法創(chuàng)建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作用域 閉包的詳細(xì)內(nèi)容,更多關(guān)于JavaScript作用域 閉包的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
日韩视频免费直播| 欧美精品第1页| 国产精品红桃| 欧美日韩情趣电影| 亚洲日本一区二区三区| 国产成人精品一区二区三区四区| 亚洲欧洲精品一区二区| 日韩限制级电影在线观看| 午夜精品成人在线| 不卡在线视频中文字幕| 91成人免费在线| 成人欧美一区二区三区黑人麻豆| 高清久久久久久| 欧美三区在线视频| 亚洲色图20p| 国产91丝袜在线播放| 老司机亚洲精品| 亚洲图片激情小说| av在线这里只有精品| 欧洲一区二区三区免费视频| 亚洲综合偷拍欧美一区色| 女女同性精品视频| 91精品视频网| 日本aⅴ亚洲精品中文乱码| 男人的天堂成人在线| 亚洲一级电影视频| 亚洲一区图片| 三级在线观看一区二区| 久久一区亚洲| 亚洲欧美色一区| 91麻豆免费观看| 欧美一区二区三区思思人| 日韩av电影免费观看高清完整版在线观看 | 日韩三级视频在线看| 日本亚洲视频在线| 国产九九精品| 亚洲乱码视频| 国产精品久线观看视频| 91老司机福利 在线| 日韩欧美久久一区| 另类专区欧美蜜桃臀第一页| 亚洲激情网址| 国产精品欧美一区喷水| 91麻豆文化传媒在线观看| 精品奇米国产一区二区三区| 国产乱码精品一区二区三区av| 一本大道综合伊人精品热热| 亚洲最大色网站| 国模 一区 二区 三区| 国产午夜亚洲精品午夜鲁丝片| 成人美女视频在线看| 欧美成人精品福利| 大胆欧美人体老妇| 日韩一区二区电影在线| 国产麻豆午夜三级精品| 欧美大片专区| 国产网红主播福利一区二区| 欧美一区国产在线| 久久久久久一二三区| 成人av第一页| 亚洲精品一区二区三区影院 | 欧美亚洲一区二区在线| 日本欧美在线观看| 在线免费观看一区| 七七婷婷婷婷精品国产| 欧美主播一区二区三区美女| 久久国产精品免费| 久久久另类综合| 国产亚洲精品久久久久婷婷瑜伽| 亚洲成人av在线电影| 欧美三级日本三级少妇99| 成人天堂资源www在线| 亚洲欧洲精品一区二区三区不卡| 久久久久综合| 国产91丝袜在线播放九色| 欧美精品一区二区精品网| www.色综合.com| 国产欧美视频在线观看| 久久久综合网| 老司机免费视频一区二区| 欧美日本乱大交xxxxx| 国产一区在线看| 欧美精品一区二区三区视频| 亚洲欧美在线网| 国产精品久久久99| 亚洲一区自拍| 成人黄色大片在线观看| 一区二区三区美女视频| 欧美一区2区视频在线观看| 亚洲伦伦在线| 国产成人免费av在线| 国产精品美女久久久久久久久久久| 狂野欧美一区| 99久久国产免费看| 偷拍日韩校园综合在线| 久久婷婷成人综合色| 亚洲欧美清纯在线制服| 粉嫩欧美一区二区三区高清影视 | 欧美精品啪啪| 蜜桃av一区二区在线观看| 中文字幕不卡三区| 激情都市一区二区| 18成人在线观看| 日韩一区和二区| 一区二区冒白浆视频| 丰满岳乱妇一区二区三区| 亚洲va韩国va欧美va精品| 久久久精品人体av艺术| 色94色欧美sute亚洲13| 欧美日韩综合久久| 国内精品伊人久久久久影院对白| 亚洲三级久久久| 欧美一二三区精品| 久久中文精品| 亚洲无线观看| 成人激情文学综合网| 五月天激情小说综合| 国产精品美女久久久久久久久久久| 欧美在线影院一区二区| 亚洲欧洲视频| 91免费版在线| 经典三级在线一区| 亚洲v日本v欧美v久久精品| 国产精品久久久久久一区二区三区| 欧美一区二区视频免费观看| 久久岛国电影| 精品不卡一区二区三区| 懂色av一区二区夜夜嗨| 日本中文字幕一区二区视频| 亚洲视频一区二区在线观看| 精品国产精品网麻豆系列| 欧美色综合网站| 噜噜噜噜噜久久久久久91 | 国产99久久久久| 天天综合日日夜夜精品| 国产精品久久二区二区| 精品久久国产字幕高潮| 欧美日韩另类国产亚洲欧美一级| 亚洲深爱激情| 欧美午夜不卡| 91美女在线观看| 国产成人a级片| 久久aⅴ国产欧美74aaa| 日韩经典中文字幕一区| 一级中文字幕一区二区| 亚洲欧洲av另类| 久久精品视频一区二区三区| 日韩午夜激情av| 欧美视频一二三区| 色999日韩国产欧美一区二区| 国产欧美日韩一区| 激情综合亚洲| 日韩av电影免费观看高清完整版 | 丝袜国产日韩另类美女| 亚洲国产中文字幕| 亚洲乱码国产乱码精品精可以看| 国产精品久久一级| 国产精品久久一卡二卡| 国产视频一区二区在线观看| 日韩欧美一级片| 欧美日精品一区视频| 久久字幕精品一区| 国产精品手机在线| 亚洲精品一区二区三区樱花| 欧美在线播放一区二区| kk眼镜猥琐国模调教系列一区二区| 国产精品白丝jk白祙喷水网站| 免费精品99久久国产综合精品| 亚洲成a天堂v人片| 午夜久久久久久久久久一区二区| 亚洲一区精品在线| 亚洲黄色在线视频| 综合色天天鬼久久鬼色| 国产精品美女久久久久久久久| 国产日本欧洲亚洲| 国产欧美日韩久久| 国产女主播在线一区二区| 亚洲国产精品国自产拍av| 国产蜜臀97一区二区三区| 中文字幕中文在线不卡住| 亚洲欧美综合在线精品| 亚洲欧美激情小说另类| 中文字幕一区二区三区乱码在线 | 久久中文娱乐网| 久久影院视频免费| 久久欧美一区二区| 久久精品免费在线观看| 亚洲国产精品二十页| 中文字幕在线一区| 中文字幕一区二区不卡| 亚洲视频在线观看一区| 亚洲一本大道在线| 午夜一区二区三区在线观看| 视频一区二区中文字幕| 看电影不卡的网站| 国产精品99久久久久久有的能看| 成人综合在线观看| 91美女在线观看| 亚洲免费大片| 久久夜色精品|