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

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

深入淺出JavaScript之閉包(Closure)

瀏覽:32日期:2023-11-16 17:23:59

閉包(closure)是掌握Javascript從人門到深入一個非常重要的門檻,它是Javascript語言的一個難點,也是它的特色,很多高級應用都要依靠閉包實現。下面寫下我的學習筆記~

深入淺出JavaScript之閉包(Closure)

閉包-無處不在

在前端編程中,使用閉包是非常常見的,我們經常有意無意,直接或間接用到了閉包。閉包可以使傳遞數據更加靈活(比如處理一些點擊事件)

!function() {var localData = "localData here"; document.addEventListener('click', //處理點擊事件時用到了外部局部變量,比如這里的localData function(){ console.log(localData); }); }();

又比如下面這個例子:(是不是很親切~~)

!function() {var localData = "localData here";var url = "http://www.baidu.com/";$.ajax({ url : url, success : function() { // do sth... console.log(localData); } }); }();

再來看一個例子~~這種情況就是我們通常所說的閉包

function outer() { var localVal = 30; return function(){ return localVal; } } var func = outer(); func(); // 30

這個例子中調用outer()返回匿名函數function(),這個匿名函數中可以訪問outer()的局部變量localVal,在outer()調用結束后,再次調用func()的時候,仍然能訪問到outer()的局部變量localVal

閉包的概念

閉包,不同于一般的函數,它允許一個函數在立即詞法作用域外調用時,仍可訪問非本地變量。 --維基百科

閉包就是能夠讀取其他函數內部變量的函數。 --阮一峰

由于在Javascript語言中,只有函數內部的子函數才能讀取局部變量,因此可以把閉包簡單理解成"定義在一個函數內部的函數"。

所以,在本質上,閉包就是將函數內部和函數外部連接起來的一座橋梁

閉包的用途

這部分轉自這篇博文

閉包可以用在許多地方。它的最大用處有兩個,一個是前面提到的可以讀取函數內部的變量,另一個就是讓這些變量的值始終保持在內存中。

function f1(){var n=999;nAdd=function(){n+=1}function f2(){alert(n);}return f2;}var result=f1();result(); // 999nAdd();result(); // 1000

在這段代碼中,result實際上就是閉包f2函數。它一共運行了兩次,第一次的值是999,第二次的值是1000。這證明了,函數f1中的局部變量n一直保存在內存中,并沒有在f1調用后被自動清除。

為什么會這樣呢?原因就在于f1是f2的父函數,而f2被賦給了一個全局變量,這導致f2始終在內存中,而f2的存在依賴于f1,因此f1也始終在內存中,不會在調用結束后,被垃圾回收機制(garbage collection)回收。

這段代碼中另一個值得注意的地方,就是"nAdd=function(){n+=1}"這一行,首先在nAdd前面沒有使用var關鍵字,因此nAdd是一個全局變量,而不是局部變量。其次,nAdd的值是一個匿名函數(anonymous function),而這個匿名函數本身也是一個閉包,所以nAdd相當于是一個setter,可以在函數外部對函數內部的局部變量進行操作。

閉包-封裝

(function() { var _userId = 23492; var _typeId = 'item'; var export = {};function converter(userId) { return +userId; } export.getUserId = function() {return converter(_userId);} export.getTypeId = function() {return _typeId; } window.export = export; //通過此方式輸出}()); export.getUserId(); // 23492 export.getTypeId(); // item export._userId; // undefined export._typeId; // undefined export.converter; // undefined

利用閉包的特性能讓我們封裝一些復雜的函數邏輯,在這個例子中調用export上的方法(getUserId,getTypeId)間接訪問函數里私有變量,但是直接調用export._userId是沒法拿到_userId的。這也是Node里面常用到特性吧~

常見錯誤之循環閉包

下面這個案例,我們添加3個div,值分別為aaa,bbb,ccc,我們想實現的是點擊aaa輸出1,點擊bbb輸出2,點擊ccc輸出3

document.body.innerHTML = "<div id=div1>aaa</div>" + "<div id=div2>bbb</div><div id=div3>ccc</div>"; for (var i = 1; i < 4; i++) {document.getElementById('div' + i). addEventListener('click', function() { alert(i); // all are 4! }); }

深入淺出JavaScript之閉包(Closure)

結果點擊aaa,bbb還是ccc都是alert(4)~~

產生這樣的問題在于這個i的值在初始化完成的時候就已經是4了

要達到我們想要的點擊aaa輸出1,點擊bbb輸出2,點擊ccc輸出3,要用到閉包的技巧,在每次循環的時候,用立即執行的匿名函數把它包裝起來,這樣子做的話,每次alert(i)的值就取自閉包環境中的i,這個i來自每次循環的賦值i就能輸出1,2,3了

document.body.innerHTML = "<div id=div1>aaa</div>" + "<div id=div2>bbb</div>" + "<div id=div3>ccc</div>"; for (var i = 1; i < 4; i++) { !function(i){ //②再用這個參數i,到getElementById()中引用 document.getElementById('div' + i). addEventListener('click', function() { alert(i); // 1,2,3 }); }(i); //①把遍歷的1,2,3的值傳到匿名函數里面}

深入淺出JavaScript之閉包(Closure)

思考題

如果你能理解下面兩段代碼的運行結果,應該就算理解閉包的運行機制了。(來自阮老師)這題目總結得真秒~~

代碼片段一。

var name = "The Window";var object = {name : "My Object",getNameFunc : function(){return function(){return this.name;};}};alert(object.getNameFunc()());

代碼片段二。

var name = "The Window";var object = {name : "My Object",getNameFunc : function(){var that = this;return function(){return that.name;};}};alert(object.getNameFunc()());

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国精品一区二区| 国产精品分类| 日韩中文影院| 亚洲日本网址| 日韩av免费大片| 欧美国产小视频| 欧美国产中文高清| 老司机免费视频一区二区三区| 欧美激情日韩| 国产精品亚洲欧美一级在线| 国产精品永久| 高清精品久久| 久久免费黄色| 久久国产66| 91欧美极品| 久久只有精品| 日韩三区在线| 久久国产99| 欧美日韩亚洲一区二区三区在线| 国产精品成人自拍| 97精品国产| 成人免费网站www网站高清| 蜜臀av免费一区二区三区| 首页国产欧美久久| 欧美日一区二区在线观看| 老鸭窝一区二区久久精品| 国产精品福利在线观看播放| 精品亚洲美女网站| 久久香蕉精品| 国产精品一区二区99| 亚洲天堂资源| 蜜臀久久久久久久| 国产精品视频一区二区三区综合| 久久av免费看| 欧美综合另类| 日韩在线网址| 精品国产精品国产偷麻豆| 久久亚洲成人| 日本视频一区二区| 亚洲电影有码| 亚州精品视频| 97精品国产| 在线精品观看| 国产成人免费| 蜜臀久久久久久久| 精品久久电影| 蜜臀av国产精品久久久久| 老色鬼精品视频在线观看播放| 亚洲国内欧美| 国产精品麻豆成人av电影艾秋 | 国产伊人久久| 亚洲综合三区| 久久精品午夜| 亚洲综合精品| 精品国产亚洲一区二区三区大结局| 亚洲欧美日韩高清在线| 国产色噜噜噜91在线精品| 欧美日韩在线播放视频| 欧美日韩a区| 五月婷婷亚洲| 国产精品15p| 中文精品在线| 国产一区二区亚洲| 日本在线不卡视频一二三区| 日韩视频网站在线观看| 久久国产精品色av免费看| 亚洲夜间福利| 免费亚洲婷婷| 免费国产亚洲视频| 中文字幕系列一区| 国产欧美三级| 亚洲免费一区二区| 伊伊综合在线| 国产精品一二| 视频一区中文字幕| 国产精品成久久久久| 在线看片日韩| 黑丝美女一区二区| 精品日产乱码久久久久久仙踪林| 一区二区亚洲视频| 亚洲91视频| 久久精品免费看| 欧美一区二区三区久久精品| 国产视频一区三区| 国产精品亚洲一区二区三区在线观看| 久久国产麻豆精品| 亚洲伊人精品酒店| 在线视频免费在线观看一区二区| 最近高清中文在线字幕在线观看1| 国产麻豆一区| 中文字幕av一区二区三区人| 午夜欧美理论片| 精品丝袜在线| 天堂√8在线中文| 久久精品国产99国产| 国产麻豆一区二区三区| 日本va欧美va精品| 亚洲精品一级| 亚洲精品免费观看| 视频一区二区三区入口| 国产精品色网| 99精品99| 黄色av日韩| 国产手机视频一区二区| 午夜久久久久| 亚洲福利免费| 免费视频一区三区| 亚洲成人精品| 91精品久久久久久久久久不卡| 日韩1区2区| 97精品一区二区| 国产精品久久久久久久免费观看| 精品视频一二| а√在线中文在线新版| 黄色aa久久| 精品国产黄a∨片高清在线| 美女视频黄免费的久久| 国产福利亚洲| 麻豆视频一区二区| 久久精品国产一区二区| 免费日韩成人| 精品久久免费| 成人亚洲欧美| 日韩欧美视频专区| 欧美二区视频| 91成人精品| 亚洲深夜福利| 亚洲综合中文| 日本a级不卡| 国产精品密蕾丝视频下载| 国产精品第一| 国产精品久久久久久久久久10秀| 四虎8848精品成人免费网站| 日韩电影免费在线观看| 亚洲五月婷婷| 一区在线视频观看| 久久午夜精品一区二区| 日本中文字幕一区二区视频| 日韩激情啪啪| 国产精品www994| 中文字幕在线视频久| 欧美亚洲国产一区| 欧美一区=区| 日韩高清在线不卡| 国产精品a级| 日韩伦理在线一区| 在线视频亚洲| 日本免费新一区视频| 久久中文字幕导航| 欧美成人基地| 午夜在线一区二区| 日韩一区二区三区四区五区| 久久国产欧美日韩精品| 国产一区二区三区成人欧美日韩在线观看| 黄色在线网站噜噜噜| 亚洲性色视频| 一区二区三区网站| 国产欧美激情| 欧美freesex黑人又粗又大| 黄色在线一区| 日韩av成人高清| av在线资源| 免费一区二区视频| 麻豆91精品91久久久的内涵| 久久一区二区中文字幕| 蜜桃视频在线观看一区二区| 久久精品av麻豆的观看方式| 日韩久久视频| 亚洲精品福利| 麻豆精品视频在线观看免费| 亚洲调教视频在线观看| 日韩精品一区二区三区av| 国产一区二区三区四区二区| 国产一区91| 国产精品theporn| 欧美另类综合| 国产精品极品国产中出| 1000部精品久久久久久久久| 青草国产精品| 久久久久.com| 久久国产日韩欧美精品| 亚洲国产欧美日本视频| 亚洲区欧美区| 久久天堂成人| 国产欧美在线| 精品一区免费| 欧美国产另类| 蜜桃视频在线观看一区| 成人三级高清视频在线看| 玖玖玖国产精品| 岛国av免费在线观看| 日韩精品免费视频一区二区三区| 超碰成人av| 欧美精品中文字幕亚洲专区| 激情自拍一区| 美女视频黄 久久| 国产精品日本欧美一区二区三区| 另类欧美日韩国产在线| 亚洲三级在线| 久久精品国产99久久|