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

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

帶你一分鐘理解 JavaScript 閉包

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

先看一段代碼:

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

簡單吧。再來看一段代碼:

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

簡單吧。

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

帶你一分鐘理解 JavaScript 閉包

有權訪問另一個函數作用域內變量的函數都是閉包。這里 inc 函數訪問了構造函數 a 里面的變量 n,所以形成了一個閉包。

再來看一段代碼:

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

看看是怎么執行的:

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

c(),這一句等同于 inc(); 注意,函數名只是一個標識(指向函數的指針),而()才是執行函數。

后面三句翻譯過來就是: var c = inc; inc(); inc();,跟第一段代碼有區別嗎? 沒有。

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

所有的教科書教程上都喜歡用最后一段來說明閉包,但我覺得這將問題復雜化了。這里面返回的是函數名,沒看過譚浩強C/C++程序設計的同學可能一下子沒反應出帶不帶()的區別,也就是說這種寫法自帶一個陷阱。雖然這種寫法更顯高大上,但我還是喜歡將問題單一化,看看代碼 1 和代碼 2,你還會糾結函數的調用,你會糾結 n 的值嗎?

帶你一分鐘理解 JavaScript 閉包

 為啥要這樣寫?

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

而之所以要用 return 返回函數標識 inc,是因為在 a 函數外部無法直接調用 inc 函數,所以 return inc 與外部聯系起來,代碼 2 中的 this 也是將 inc 與外部聯系起來而已。

帶你一分鐘理解 JavaScript 閉包

 常見的陷阱

看看這個:

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 ,萬萬沒想到輸出10個10?

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

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

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

至于 i 的值怎么還能保留,其實從文章開頭一路讀下來,這應該沒有什么可以糾結的地方。盤子里面的菜,吃了一塊不就應該少一塊嗎?

 總結一下

閉包就是一個函數引用另外一個函數的變量,因為變量被引用著所以不會被回收,因此可以用來封裝一個私有變量。這是優點也是缺點,不必要的閉包只會徒增內存消耗!另外使用閉包也要注意變量的值是否符合你的要求,因為他就像一個靜態私有變量一樣。閉包通常會跟很多東西混搭起來,接觸多了才能加深理解,這里只是開個頭說說基礎性的東西。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
视频福利一区| 日韩福利视频导航| 在线中文字幕播放| 久久久久国产精品一区二区| 丝瓜av网站精品一区二区| 麻豆一区二区在线| 亚洲天堂av资源在线观看| 久久精品毛片| 日韩综合一区二区| 亚洲激情二区| 日韩在线短视频| 国产精品777777在线播放 | 国产精品一线| 久久99伊人| 亚洲午夜久久久久久尤物| 成人午夜毛片| 天堂8中文在线最新版在线| 久久av超碰| 亚洲专区欧美专区| 国产99久久| 欧美日韩免费观看一区=区三区| 高清不卡一区| av高清不卡| 国产在线观看www| 日韩精品2区| 亚洲国产不卡| 亚洲国产成人精品女人| 日韩av在线中文字幕| 国语精品一区| 日韩免费视频| 亚洲一级二级| 不卡视频在线| 亚洲欧美日韩一区在线观看| 99精品综合| 婷婷综合五月| 蜜桃传媒麻豆第一区在线观看| 九九综合九九| 日本一不卡视频| 精品亚洲成人| 香蕉精品视频在线观看| 婷婷综合电影| 成人免费一区| 激情久久久久久久| 国产精品观看| 欧美在线资源| 国产精品综合| 成人片免费看| 日韩影院精彩在线| 麻豆一区在线| 亚洲在线免费| 超碰在线99| 亚洲精品乱码久久久久久蜜桃麻豆 | 日韩中文字幕| 亚洲黄色网址| 蜜桃av一区二区| 中文字幕在线视频久| 亚洲精选av| 国产成人精品一区二区三区视频 | 丝袜脚交一区二区| 韩国久久久久久| 日韩精品亚洲专区在线观看| av综合电影网站| 国产欧美一级| 免费在线视频一区| 青青青免费在线视频| 国产精品亚洲欧美一级在线| 在线国产一区| 不卡一区综合视频| 日本在线精品| 精品欧美日韩精品| 亚洲精品在线二区| 999久久久91| 麻豆精品少妇| 欧美激情亚洲| 四虎成人精品一区二区免费网站 | 日本在线啊啊| 久久久久免费| 久久精品国产久精国产爱| 亚洲欧美久久久| 99久久夜色精品国产亚洲1000部| 国产成人77亚洲精品www| 国产精品久久久免费| 欧美久久香蕉| 日韩国产精品久久久| 亚洲网址在线观看| 中文精品电影| 日韩高清一区在线| 欧美日韩一区二区三区不卡视频| 国产亚洲激情| 美女黄网久久| 日韩精品视频网| 麻豆精品99| 欧美少妇精品| 亚洲精品网址| 日韩欧美在线精品| 日韩国产欧美在线播放| 老司机精品视频网| 99久久亚洲精品蜜臀| 99久久久久| 久久久777| 日韩在线播放一区二区| 国产欧美亚洲精品a| 成人免费电影网址| 亚洲乱亚洲高清| 精品美女久久| 亚洲一区久久| 美女视频黄久久| 悠悠资源网久久精品| 日韩在线电影| 亚洲欧洲高清| 蜜桃视频第一区免费观看| 欧美亚洲免费| 99成人在线| 精品欧美日韩精品| 国产精品老牛| 日本麻豆一区二区三区视频| 日韩欧美精品综合| 国产日韩欧美中文在线| 在线精品视频在线观看高清| 国产激情一区| 免费黄网站欧美| 性欧美videohd高精| 久久gogo国模啪啪裸体| 午夜亚洲精品| 91成人精品| 日韩免费在线| 精品国产一区二区三区噜噜噜| 免费美女久久99| 性一交一乱一区二区洋洋av| 美女尤物国产一区| 日本在线成人| 亚洲在线网站| 国产在线不卡| 久久精品欧美一区| 色婷婷色综合| 91亚洲成人| 日韩一区亚洲二区| 国产激情在线播放| 岛国av免费在线观看| 美女视频黄久久| 九九九精品视频| 欧美a在线观看| 国产精品蜜月aⅴ在线| 久久99蜜桃| 国产伦精品一区二区三区千人斩| 丝袜美腿亚洲色图| 日本三级亚洲精品| 国产毛片久久| 美女精品网站| 久久精品72免费观看| 国产精品chinese| 国产videos久久| 女生影院久久| 九九综合在线| 国产亚洲永久域名| 日韩国产欧美一区二区三区| 91欧美精品| 国产aⅴ精品一区二区三区久久| 精品国产91| 精品捆绑调教一区二区三区| 99成人在线视频| 欧美有码在线| 精品在线91| 欧美成a人片免费观看久久五月天| av中文字幕在线观看第一页 | 好看的av在线不卡观看| 日韩中文字幕一区二区高清99| 精品中文在线| 亚洲综合激情在线| 国产一区二区亚洲| 在线免费观看亚洲| 国内揄拍国内精品久久| 蜜臀91精品国产高清在线观看| 日韩精品一级| 伊人久久婷婷| 久久国产乱子精品免费女| 欧美日韩精品免费观看视欧美高清免费大片| 亚洲综合在线电影| 欧美精品三级在线| 鲁大师成人一区二区三区| 97精品国产| 国产精品成人一区二区网站软件| 欧美成人国产| 中文字幕高清在线播放| 久久精品欧洲| 国产精品久久久久久久免费软件| 另类av一区二区| 久久亚洲黄色| 国产精品美女在线观看直播| 亚洲精品裸体| 亚洲欧洲专区| aa国产精品| 欧美日韩国产亚洲一区| 久久在线视频免费观看| 日韩欧美三级| 婷婷精品视频| 中国女人久久久| 香蕉国产精品| 亚洲综合专区| 综合激情在线|