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

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

深入淺出JavaScript之閉包(Closure)

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

閉包(closure)是掌握J(rèn)avascript從人門到深入一個非常重要的門檻,它是Javascript語言的一個難點,也是它的特色,很多高級應(yīng)用都要依靠閉包實現(xiàn)。下面寫下我的學(xué)習(xí)筆記~

深入淺出JavaScript之閉包(Closure)

閉包-無處不在

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

!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

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

閉包的概念

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

閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。 --阮一峰

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

所以,在本質(zhì)上,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來的一座橋梁

閉包的用途

這部分轉(zhuǎn)自這篇博文

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

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

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

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

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

閉包-封裝

(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

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

常見錯誤之循環(huán)閉包

下面這個案例,我們添加3個div,值分別為aaa,bbb,ccc,我們想實現(xiàn)的是點擊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)

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

產(chǎn)生這樣的問題在于這個i的值在初始化完成的時候就已經(jīng)是4了

要達(dá)到我們想要的點擊aaa輸出1,點擊bbb輸出2,點擊ccc輸出3,要用到閉包的技巧,在每次循環(huán)的時候,用立即執(zhí)行的匿名函數(shù)把它包裝起來,這樣子做的話,每次alert(i)的值就取自閉包環(huán)境中的i,這個i來自每次循環(huán)的賦值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){ //②再用這個參數(shù)i,到getElementById()中引用 document.getElementById('div' + i). addEventListener('click', function() { alert(i); // 1,2,3 }); }(i); //①把遍歷的1,2,3的值傳到匿名函數(shù)里面}

深入淺出JavaScript之閉包(Closure)

思考題

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

代碼片段一。

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()());

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美激情在线精品一区二区三区| 午夜亚洲福利在线老司机| 亚洲三级毛片| 蜜桃视频一区二区| 日韩极品在线观看| 国产色噜噜噜91在线精品| 国产精品成人**免费视频 | 久久免费精品| 国产精品黄网站| 国产一区日韩| 欧美在线资源| 日本欧美大码aⅴ在线播放| 精品视频网站| 欧美日韩国产综合网| 日韩国产欧美在线播放| 国产欧美69| 热三久草你在线| 一区久久精品| 欧美亚洲tv| 桃色一区二区| 日韩精品免费视频一区二区三区| 精品中文在线| 女同性一区二区三区人了人一| 噜噜噜久久亚洲精品国产品小说| 国产区精品区| 亚洲香蕉网站| 国产精品亚洲四区在线观看| 日韩另类视频| 日本中文字幕不卡| 精品亚洲二区| 国产婷婷精品| 久久久久伊人| aⅴ色国产欧美| 精品视频自拍| 亚洲三级网站| 日韩成人高清| 欧美一区成人| 午夜日韩福利| 国产精品探花在线观看| 欧美午夜不卡| 国产资源在线观看入口av| 亚洲另类黄色| 欧美中文字幕一区二区| 国产极品久久久久久久久波多结野| 亚洲v在线看| 国产欧美日本| 丝袜美腿亚洲一区二区图片| 97精品一区二区| 日韩av午夜在线观看| 亚洲调教视频在线观看| 久久精品亚洲| 日韩动漫一区| 国产视频一区在线观看一区免费| 捆绑调教美女网站视频一区| 久久最新视频| 91精品在线观看国产| 国产精品第十页| 日韩国产欧美一区二区三区| 免费精品国产的网站免费观看| 麻豆视频一区| 亚洲97av| 99热精品在线观看| 桃色一区二区| 国产成人精品福利| 国产亚洲一区二区三区啪| 蜜桃一区二区三区在线| 五月婷婷亚洲| 三级精品视频| 国产精品99一区二区三区| 国产日韩视频| 亚洲欧美专区| 欧美中文字幕| 99国产精品自拍| 激情六月综合| 激情综合激情| 久久国产日韩| 97视频热人人精品免费| 久久中文在线| 国产精品久久久久久久免费软件| 日本在线观看不卡视频| 亚洲一区亚洲| 中文精品在线| 制服诱惑一区二区| 婷婷综合激情| 1024精品久久久久久久久| 久久久久久久久久久妇女| 亚洲一区资源| a天堂资源在线| 一区二区三区四区日本视频| 国产suv精品一区二区四区视频| 免费在线亚洲欧美| 精品国产欧美日韩一区二区三区| 国产福利亚洲| 麻豆精品久久久| 欧美xxxx中国| 亚洲一级少妇| 国产99久久久国产精品成人免费| 三级精品视频| 偷拍欧美精品| 免费在线观看一区二区三区| 在线看片日韩| 日韩不卡手机在线v区| 日本午夜精品久久久久| 国产亚洲一卡2卡3卡4卡新区| 国产精品nxnn| 久久91导航| 欧美中文日韩| 欧美一区激情| 色婷婷色综合| 精品一区三区| 亚洲区欧美区| 欧美激情aⅴ一区二区三区 | 日本亚洲欧美天堂免费| 日韩在线网址| 国产精品久久乐| 六月婷婷综合| 日韩一区二区免费看| 最新国产精品视频| 青青草国产成人99久久| 免费在线日韩av| 久久久国产精品一区二区中文| 亚洲精品中文字幕乱码| 亚洲视频国产精品| 国产亚洲一卡2卡3卡4卡新区| 国产成人精品999在线观看| 日韩中文av| 久久伊人亚洲| 91精品国产91久久久久久黑人| 99精品美女| 日本中文字幕不卡| 精品在线网站观看| 1024精品一区二区三区| 一区二区三区国产盗摄| 91亚洲精品在看在线观看高清| 国产精品99视频| 午夜在线一区二区| 麻豆91小视频| 国产亚洲福利| 久久在线91| 亚洲一区二区三区免费在线观看| 国产精品黄色| 久久婷婷av| 欧美日韩一区二区三区不卡视频| 成人羞羞在线观看网站| 亚洲精品国产精品粉嫩| 国产一区二区三区不卡av | 日韩一区中文| av中文资源在线资源免费观看| 视频一区视频二区在线观看| 欧美激情在线精品一区二区三区| 亚洲天堂久久| 日韩精品成人| 亚洲欧美高清| 国产日韩欧美一区二区三区| 国产免费成人| 国产亚洲欧美日韩在线观看一区二区| 在线看片福利| 91福利精品在线观看| 中文在线а√天堂| 日韩1区2区3区| 日韩毛片在线| 日本在线成人| 亚洲少妇在线| 久久久精品网| 麻豆91在线播放| 日韩中文字幕在线一区| 日韩av首页| 国产精品99久久久久久董美香| 午夜一级久久| 国产精品麻豆久久| 国产日韩免费| 日韩毛片网站| 丝袜美腿成人在线| 国产综合婷婷| 国产粉嫩在线观看| 久久久91麻豆精品国产一区| 日本欧美在线| 亚洲精品九九| 鲁大师影院一区二区三区| 日韩精品欧美| 久久久久久亚洲精品美女| 国产成人精品一区二区免费看京| 岛国精品一区| 欧美午夜精品一区二区三区电影| 久久中文欧美| 精品三区视频| 国产欧美日韩亚洲一区二区三区| 亚洲精品一二三区区别| 欧美香蕉视频| 日韩欧美在线中字| 91综合网人人| 福利在线免费视频| 福利一区二区三区视频在线观看| 国产精品多人| 麻豆精品视频在线观看| 国产精品日本一区二区三区在线| 欧美日韩精品一区二区三区视频 | 亚洲精品在线二区| 欧美理论视频| 蜜桃成人av|