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

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

帶你一分鐘理解 JavaScript 閉包

瀏覽:135日期: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)訪問(wèn)另一個(gè)函數(shù)作用域內(nèi)變量的函數(shù)都是閉包。這里 inc 函數(shù)訪問(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)有。

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

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

帶你一分鐘理解 JavaScript 閉包

 為啥要這樣寫?

我們知道,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è)餐廳,盤子總是有限的,所以服務(wù)員會(huì)去巡臺(tái)回收空盤子,但還裝著菜的盤子他怎么敢收? 當(dāng)然,你自己手動(dòng)倒掉了盤子里面的菜(=null),那盤子就會(huì)被收走了,這就是所謂的內(nèi)存回收機(jī)制。

至于 i 的值怎么還能保留,其實(shí)從文章開(kāi)頭一路讀下來(lái),這應(yīng)該沒(méi)有什么可以糾結(jié)的地方。盤子里面的菜,吃了一塊不就應(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)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品麻豆成人av电影艾秋| 国产农村妇女精品一二区| 一区视频在线| 蜜桃视频第一区免费观看| 午夜国产欧美理论在线播放| 麻豆久久精品| 国产日韩欧美一区| 国内一区二区三区| av在线日韩| 午夜欧美精品| 91成人小视频| 国产精品美女午夜爽爽| se01亚洲视频 | 日韩一区二区免费看| 视频一区二区国产| 久久国产视频网| 日产精品一区| 亚洲区第一页| 国产在线一区不卡| 欧美+日本+国产+在线a∨观看| 中文字幕日韩欧美精品高清在线| 欧美日韩a区| 国产精品**亚洲精品| 日韩啪啪电影网| 蜜桃久久av| 精品一区二区三区四区五区| 欧美在线亚洲综合一区| 国产精品亲子伦av一区二区三区 | 老色鬼久久亚洲一区二区| 日本免费新一区视频| 麻豆精品久久久| 久久久久蜜桃| 欧美天堂在线| 欧美1区免费| 国产精品久久久久久模特| 国产一区日韩一区| 国产精品主播在线观看| 免费视频一区三区| 国产精品观看| 视频一区二区中文字幕| av高清不卡| 青青在线精品| 亚洲在线观看| 国产亚洲一区二区手机在线观看| 日本a级不卡| 欧美va天堂| 国产一区精品福利| 日韩动漫一区| 狠狠操综合网| 国产一区二区三区四区| 亚洲永久精品唐人导航网址| 亚洲性色av| 国产精品久久久一区二区| 国产精品婷婷| 久久精品主播| 麻豆精品在线观看| 日韩精品成人| 亚洲综合国产| 亚洲先锋成人| 日韩免费福利视频| 欧美精品国产一区| 国产免费成人| 亚洲天堂成人| 日韩精品麻豆| 视频在线不卡免费观看| 国产日产一区| 亚洲1区在线观看| 国产精品嫩草99av在线| 色婷婷精品视频| 日本一区二区高清不卡| 国产精一区二区| 日韩av成人高清| 久久亚洲美女| 久久xxxx| 日本欧美在线看| 免费不卡中文字幕在线| 成年男女免费视频网站不卡| 国产精品免费大片| 欧美日韩一视频区二区| 日韩中出av| 亚洲一级淫片| 男人操女人的视频在线观看欧美| 欧美不卡高清| 欧美久久精品一级c片| 精品亚洲美女网站| 午夜精品久久久久久久久久蜜桃| 精品国产aⅴ| 国产成人精品三级高清久久91| 麻豆国产精品一区二区三区| 欧美黄页在线免费观看| 久久久久伊人| 91精品一区| 日韩高清欧美激情| 欧美日韩一区二区三区四区在线观看| 日韩综合一区二区| 91精品福利观看| 国产精品网址| 欧美国产专区| av中文字幕在线观看第一页| 亚洲黄色网址| 免费不卡中文字幕在线| 夜久久久久久| 一区二区精彩视频| 日本不卡在线视频| 欧美国产先锋| 正在播放日韩精品| 五月激情久久| 欧美日韩视频一区二区三区| 老司机精品久久| 欧美一区自拍| 国产成人免费| 激情婷婷综合| 亚洲精品一级| 国产精品xvideos88| 国产色播av在线| 一区二区亚洲精品| 日韩欧美2区| 久久不见久久见免费视频7| 精品精品国产三级a∨在线| 在线看片福利| 久久午夜影视| 日本不卡一区二区三区| 精品三区视频| 国精品一区二区| 亚洲日韩中文字幕一区| 国产欧美高清| 亚洲福利久久| 日本不卡一二三区黄网| 国产一区二区三区久久| 日韩视频一区| 国产精品视频首页| 国内亚洲精品| 欧美日韩夜夜| 欧美肉体xxxx裸体137大胆| 一区二区精彩视频| 日韩不卡一区| 在线国产一区二区| 国产精品日本一区二区三区在线| 亚洲www啪成人一区二区| 日本亚洲欧洲无免费码在线| 国产videos久久| 久久午夜视频| 国产精品蜜芽在线观看| 久久先锋影音| 四虎成人av| 久久性天堂网| 97精品97| 日韩三级精品| 成人精品亚洲| 国产精品一页| 国产免费成人| 国产精品1区| 国产亚洲精品v| 视频在线不卡免费观看| 中文字幕乱码亚洲无线精品一区| 精品一区二区三区四区五区| 丝袜美腿一区二区三区| 91欧美在线| 97久久亚洲| 国产视频亚洲| 日韩视频网站在线观看| 国产亚洲人成a在线v网站| 久久久久免费av| 久久精品国产在热久久| 亚洲精品少妇| 九九久久婷婷| 美女视频黄 久久| 亚洲天堂免费| 亚洲成av人片一区二区密柚 | 中文字幕亚洲影视| 亚洲va中文在线播放免费| 国产欧美日韩一级| 日韩专区在线视频| 视频小说一区二区| 欧美一级网址| 亚洲美女91| 老司机久久99久久精品播放免费| 欧美成人基地| 久久精品国产在热久久| 国产欧美一区二区色老头| 国产精品色网| 婷婷中文字幕一区| 97精品国产福利一区二区三区| 欧美天堂在线| 日韩精品a在线观看91| 99综合视频| 伊人久久大香线蕉av不卡| 在线手机中文字幕| 国内一区二区三区| 国产精品66| 欧美黑人做爰爽爽爽| 欧美日韩亚洲一区三区| 日本电影久久久| 日韩欧美中文字幕电影| 久久大逼视频| 五月天综合网站| 亚洲欧美日韩高清在线| 亚洲a在线视频| 久久久久久免费视频| 成人日韩在线|