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

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

帶你一分鐘理解 JavaScript 閉包

瀏覽:102日期:2023-11-18 11:56:31
 什么是閉包?

先看一段代碼:

function a(){ var n = 0; function inc() {n++;console.log(n); } inc(); inc(); }a(); //控制臺(tái)輸出1,再輸出2

簡(jiǎn)單吧。再來(lái)看一段代碼:

function a(){ var n = 0; this.inc = function () {n++; console.log(n); };}var c = new a();c.inc(); //控制臺(tái)輸出1c.inc(); //控制臺(tái)輸出2

簡(jiǎn)單吧。

什么是閉包?這就是閉包!

帶你一分鐘理解 JavaScript 閉包

有權(quán)訪(fǎng)問(wèn)另一個(gè)函數(shù)作用域內(nèi)變量的函數(shù)都是閉包。這里 inc 函數(shù)訪(fǎng)問(wèn)了構(gòu)造函數(shù) a 里面的變量 n,所以形成了一個(gè)閉包。

再來(lái)看一段代碼:

function a(){ var n = 0; function inc(){ n++;console.log(n); } return inc;}var c = a();c(); //控制臺(tái)輸出1c(); //控制臺(tái)輸出2

看看是怎么執(zhí)行的:

var c = couter(),這一句 couter()返回的是函數(shù) inc,那這句等同于 var c = inc;

c(),這一句等同于 inc(); 注意,函數(shù)名只是一個(gè)標(biāo)識(shí)(指向函數(shù)的指針),而()才是執(zhí)行函數(shù)。

后面三句翻譯過(guò)來(lái)就是: var c = inc; inc(); inc();,跟第一段代碼有區(qū)別嗎? 沒(méi)有。

什么是閉包?這就是閉包!

所有的教科書(shū)教程上都喜歡用最后一段來(lái)說(shuō)明閉包,但我覺(jué)得這將問(wèn)題復(fù)雜化了。這里面返回的是函數(shù)名,沒(méi)看過(guò)譚浩強(qiáng)C/C++程序設(shè)計(jì)的同學(xué)可能一下子沒(méi)反應(yīng)出帶不帶()的區(qū)別,也就是說(shuō)這種寫(xiě)法自帶一個(gè)陷阱。雖然這種寫(xiě)法更顯高大上,但我還是喜歡將問(wèn)題單一化,看看代碼 1 和代碼 2,你還會(huì)糾結(jié)函數(shù)的調(diào)用,你會(huì)糾結(jié) n 的值嗎?

帶你一分鐘理解 JavaScript 閉包

 為啥要這樣寫(xiě)?

我們知道,js的每個(gè)函數(shù)都是一個(gè)個(gè)小黑屋,它可以獲取外界信息,但是外界卻無(wú)法直接看到里面的內(nèi)容。將變量 n 放進(jìn)小黑屋里,除了 inc 函數(shù)之外,沒(méi)有其他辦法能接觸到變量 n,而且在函數(shù) a 外定義同名的變量 n 也是互不影響的,這就是所謂的增強(qiáng)“封裝性”。

而之所以要用 return 返回函數(shù)標(biāo)識(shí) inc,是因?yàn)樵?a 函數(shù)外部無(wú)法直接調(diào)用 inc 函數(shù),所以 return inc 與外部聯(lián)系起來(lái),代碼 2 中的 this 也是將 inc 與外部聯(lián)系起來(lái)而已。

帶你一分鐘理解 JavaScript 閉包

 常見(jiàn)的陷阱

看看這個(gè):

function createFunctions(){ var result = new Array(); for (var i=0; i < 10; i++){result[i] = function(){ return i;}; } return result;}var funcs = createFunctions();for (var i=0; i < funcs.length; i++){ console.log(funcs[i]());}

乍一看,以為輸出 0~9 ,萬(wàn)萬(wàn)沒(méi)想到輸出10個(gè)10?

這里的陷阱就是:函數(shù)帶()才是執(zhí)行函數(shù)! 單純的一句 var f = function() { alert(‘Hi’); }; 是不會(huì)彈窗的,后面接一句 f(); 才會(huì)執(zhí)行函數(shù)內(nèi)部的代碼。上面代碼翻譯一下就是:

var result = new Array(), i;result[0] = function(){ return i; }; //沒(méi)執(zhí)行函數(shù),函數(shù)內(nèi)部不變,不能將函數(shù)內(nèi)的i替換!result[1] = function(){ return i; }; //沒(méi)執(zhí)行函數(shù),函數(shù)內(nèi)部不變,不能將函數(shù)內(nèi)的i替換!...result[9] = function(){ return i; }; //沒(méi)執(zhí)行函數(shù),函數(shù)內(nèi)部不變,不能將函數(shù)內(nèi)的i替換!i = 10;funcs = result;result = null;console.log(i); // funcs[0]()就是執(zhí)行 return i 語(yǔ)句,就是返回10console.log(i); // funcs[1]()就是執(zhí)行 return i 語(yǔ)句,就是返回10...console.log(i); // funcs[9]()就是執(zhí)行 return i 語(yǔ)句,就是返回10

為什么只垃圾回收了 result,但卻不收了 i 呢? 因?yàn)?i 還在被 function 引用著啊。好比一個(gè)餐廳,盤(pán)子總是有限的,所以服務(wù)員會(huì)去巡臺(tái)回收空盤(pán)子,但還裝著菜的盤(pán)子他怎么敢收? 當(dāng)然,你自己手動(dòng)倒掉了盤(pán)子里面的菜(=null),那盤(pán)子就會(huì)被收走了,這就是所謂的內(nèi)存回收機(jī)制。

至于 i 的值怎么還能保留,其實(shí)從文章開(kāi)頭一路讀下來(lái),這應(yīng)該沒(méi)有什么可以糾結(jié)的地方。盤(pán)子里面的菜,吃了一塊不就應(yīng)該少一塊嗎?

 總結(jié)一下

閉包就是一個(gè)函數(shù)引用另外一個(gè)函數(shù)的變量,因?yàn)樽兞勘灰弥圆粫?huì)被回收,因此可以用來(lái)封裝一個(gè)私有變量。這是優(yōu)點(diǎn)也是缺點(diǎn),不必要的閉包只會(huì)徒增內(nèi)存消耗!另外使用閉包也要注意變量的值是否符合你的要求,因?yàn)樗拖褚粋€(gè)靜態(tài)私有變量一樣。閉包通常會(huì)跟很多東西混搭起來(lái),接觸多了才能加深理解,這里只是開(kāi)個(gè)頭說(shuō)說(shuō)基礎(chǔ)性的東西。

標(biāo)簽: JavaScript
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品一区二区果冻传媒| 精品国产自在久精品国产| 国产老肥熟一区二区三区| 日韩午夜免费| 午夜在线一区| 欧美日韩一区高清| 欧美精品一区二区三| 经典三级一区二区| 欧美视频在线观看| 久久国产直播| 日韩欧美亚洲国产另类| 国产精品无人区| 奇米色一区二区三区四区| 99视频一区二区三区| 国产精品尤物| ww亚洲ww在线观看国产| 一区二区三区日本| 狠狠色丁香婷婷综合| 亚洲精品在线二区| 亚洲欧美一区二区三区极速播放 | 母乳一区在线观看| 亚洲午夜免费福利视频| 国产激情精品久久久第一区二区 | 国产欧美精品日韩区二区麻豆天美| 亚洲成人av一区二区| 成人听书哪个软件好| 亚洲欧美日韩国产一区二区| 亚洲综合在线免费观看| 另类综合日韩欧美亚洲| 欧美.日韩.国产.一区.二区| 色婷婷综合久久久久中文| 久久久久久亚洲综合影院红桃| 午夜欧美视频在线观看| 成人福利电影精品一区二区在线观看 | 国产精品视频一二三区| 狠狠久久综合婷婷不卡| 欧美一区二区三区爱爱| 一二三四区精品视频| 国产精品美女黄网| 中文在线资源观看网站视频免费不卡 | 亚洲免费成人av| 日韩视频中文| 无码av中文一区二区三区桃花岛| 91久久久免费一区二区| 国产精品欧美久久久久一区二区| 国产精品magnet| 一区二区三区视频在线看| 狂野欧美一区| 韩国毛片一区二区三区| 欧美一级二级三级乱码| 免费观看成人鲁鲁鲁鲁鲁视频| 在线观看三级视频欧美| 亚洲视频在线一区观看| 99久久er热在这里只有精品15| 欧美伊人久久久久久午夜久久久久| 国产精品的网站| 成人国产精品免费网站| 国产欧美日韩在线看| 亚洲伦伦在线| 日韩极品在线观看| 亚洲日本欧美| 国产日韩欧美激情| 日韩视频三区| 麻豆成人久久精品二区三区小说| 国产伦精品一区| 理论电影国产精品| 久久综合丝袜日本网| 亚洲一级电影| 久久在线观看免费| 在线免费观看欧美| 中文字幕精品在线不卡| 99在线精品视频在线观看| 午夜视频在线观看一区二区三区| 欧美天堂亚洲电影院在线播放| 国产成人av一区二区| 国产精品美女久久久久aⅴ| 国产精品乱码| 国产jizzjizz一区二区| 精品视频免费在线| 懂色一区二区三区免费观看 | 亚洲精品一区二区三区蜜桃下载| 亚洲性视频h| 精品无人区卡一卡二卡三乱码免费卡 | 在线观看亚洲一区| 91麻豆蜜桃一区二区三区| 日韩一级黄色大片| 韩国欧美一区| 激情亚洲综合在线| 国产精品国产三级国产| 欧美天天综合网| 欧美日韩精品不卡| 日韩成人免费看| 久久一区二区三区av| 香蕉成人啪国产精品视频综合网 | 国产毛片精品一区| 51精品国自产在线| 国产在线播精品第三| 国产精品美女久久久久久久 | 日本一区二区三区免费乱视频| 久久狠狠一本精品综合网| 国产成人av福利| 一区二区三区四区在线| 日韩精品一区二区三区老鸭窝 | 丁香婷婷综合色啪| 亚洲午夜一二三区视频| 欧美zozo另类异族| 99r精品视频| 日本免费新一区视频| 久久精品亚洲国产奇米99| 欧美+亚洲+精品+三区| 日本中文一区二区三区| 中文字幕第一区第二区| 欧美精选在线播放| 国产精品主播直播| 亚洲精品日日夜夜| 久久久久久久久一区二区| 成人性生交大片免费看中文| 亚洲成人动漫精品| 国产欧美一二三区| 欧美日本视频在线| 国产大片一区二区| 亚洲国产精品久久艾草纯爱| 久久久影院官网| 欧美性猛交xxxx黑人交| 亚洲大胆视频| 99re在线精品| 国产综合久久久久久久久久久久 | 久久综合九色综合97婷婷女人| 久久久久欧美| 午夜精品亚洲一区二区三区嫩草| 亚洲欧美中日韩| 美女视频一区免费观看| 午夜精品999| 国产成人午夜99999| 蜜臀av一区二区在线免费观看| 中文字幕亚洲不卡| 久久综合一区二区| 91精品视频网| 在线观看91精品国产入口| 9国产精品视频| 国内精品视频在线播放| 成人免费高清视频在线观看| 免费一级片91| 亚洲图片有声小说| 国产精品你懂的在线| 精品国产免费视频| 欧美一区二区在线免费观看| 在线亚洲免费视频| 噜噜噜噜噜久久久久久91| 亚洲精品国产系列| 国产中文一区| 91首页免费视频| 成人午夜短视频| 国产在线精品免费av| 日韩不卡在线观看日韩不卡视频| 亚洲美女精品一区| 中文字幕在线一区| 国产精品免费丝袜| 久久久久国产精品厨房| 欧美一级一区二区| 欧美精品免费视频| 欧美色男人天堂| 欧美视频精品在线观看| 91久久精品网| 久久亚洲精选| 久久久久看片| 色婷婷综合在线| 色综合久久久久综合99| 久久久久久九九九九| 色综合久久久久网| 久久先锋资源| 亚欧美中日韩视频| 国产偷国产偷亚洲高清97cao| 最新日韩av| 伊人蜜桃色噜噜激情综合| 欧美日韩一区在线观看视频| 欧美黄色免费| 国产精品第十页| 亚洲欧洲另类| 99热免费精品在线观看| 99国产精品久久久久老师| 99精品欧美| 午夜亚洲伦理| 久久久久天天天天| 欧美在线制服丝袜| 91精品国模一区二区三区| 欧美一级理论片| 精品国产一区二区国模嫣然| 精品久久人人做人人爰| 精品国一区二区三区| 亚洲精品一区二区三区四区高清| 久久亚洲私人国产精品va媚药| 国产亚洲精品7777| 中文字幕免费观看一区| 中文字幕在线不卡| 亚洲精品美国一| 午夜欧美一区二区三区在线播放| 日韩av二区在线播放| 国产在线不卡一卡二卡三卡四卡| 不卡视频一二三|