摘要:閉包包含了函數(shù)也包含了聲明該函數(shù)的詞法環(huán)境作用域。閉包實(shí)際上是將函數(shù)與其所操作的某些數(shù)據(jù)環(huán)境關(guān)聯(lián)起來(lái),這些數(shù)據(jù)或者是環(huán)境可以理解為它的一個(gè)作用域。定義局部變量特點(diǎn)閉包一定一個(gè),只有才會(huì)有一個(gè)封閉的命名空間。
基本概念
函數(shù)和聲明該函數(shù)的詞法環(huán)境的組合。閉包包含了函數(shù)也包含了聲明該函數(shù)的詞法環(huán)境(作用域)。
閉包實(shí)際上是將函數(shù)與其所操作的某些數(shù)據(jù)(環(huán)境)關(guān)聯(lián)起來(lái),這些數(shù)據(jù)或者是環(huán)境可以理解為它的一個(gè)作用域。因此我們可以達(dá)到一個(gè)能夠訪(fǎng)問(wèn)另一個(gè)函數(shù)作用域的變量的函數(shù)的目的。
//定義局部變量 function count() { let count = 0; return function() { count = count + 1; console.log(count); } } var getCount = count(); getCount(); getCount(); // 1 // 2特點(diǎn)
閉包一定return一個(gè)function,只有function才會(huì)有一個(gè)封閉的命名空間。
函數(shù)嵌套函數(shù)
函數(shù)內(nèi)部可以引用外部的參數(shù)和變量
參數(shù)和變量不會(huì)被垃圾回收機(jī)制回收
用途
匿名自執(zhí)行函數(shù) - 只需要執(zhí)行一次,其內(nèi)部變量無(wú)需維護(hù)
(function(){ // })();
封裝回調(diào)保存作用域(緩存結(jié)果)
for(var i = 1; i < 5; i++) { setTimeout((function(i) { return function() { console.log(i); } })(i), i * 1000) }
模擬私有方法
var myNameSpace = (function () { // 私有計(jì)數(shù)器變量 var myPrivateVar = 0; /* 記錄所有參數(shù)的私有函數(shù) */ var myPrivateMethod = function (foo) { console.log(foo + myPrivateVar); }; return { // 公有變量 myPublicVar: "foo", // 調(diào)用私有變量和方法的公用函數(shù) * myPublicFunction: function (bar) { // 增加私有計(jì)數(shù)器值 myPrivateVal ++; myPrivateMethod(bar); } }; })();常見(jiàn)誤區(qū)
在循環(huán)中創(chuàng)建閉包
for (var i = 1; i <= 5; i++) { setTimeout(function() { console.log(i) }, i * 1000) }
添加監(jiān)聽(tīng)事件
function func() { var element = document.getElementById("app"); element.onclick = function() { alert(element.id); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/106060.html
摘要:也許最好的理解是閉包總是在進(jìn)入某個(gè)函數(shù)的時(shí)候被創(chuàng)建,而局部變量是被加入到這個(gè)閉包中。在函數(shù)內(nèi)部的函數(shù)的內(nèi)部聲明函數(shù)是可以的可以獲得不止一個(gè)層級(jí)的閉包。 前言 總括 :這篇文章使用有效的javascript代碼向程序員們解釋了閉包,大牛和功能型程序員請(qǐng)自行忽略。 譯者 :文章寫(xiě)在2006年,可直到翻譯的21小時(shí)之前作者還在完善這篇文章,在Stackoverflow的How do Java...
摘要:但是閉包也不是什么復(fù)雜到不可理解的東西,簡(jiǎn)而言之,閉包就是閉包就是函數(shù)的局部變量集合,只是這些局部變量在函數(shù)返回后會(huì)繼續(xù)存在。可惜的是,并沒(méi)有提供相關(guān)的成員和方法來(lái)訪(fǎng)問(wèn)閉包中的局部變量。 (收藏自 技術(shù)狂) 前言:還是一篇入門(mén)文章。Javascript中有幾個(gè)非常重要的語(yǔ)言特性——對(duì)象、原型繼承、閉包。其中閉包 對(duì)于那些使用傳統(tǒng)靜態(tài)語(yǔ)言C/C++的程序員來(lái)說(shuō)是一個(gè)新的語(yǔ)言特性。本文將...
摘要:當(dāng)在中調(diào)用匿名函數(shù)時(shí),它們用的都是同一個(gè)閉包,而且在這個(gè)閉包中使用了和的當(dāng)前值的值為因?yàn)檠h(huán)已經(jīng)結(jié)束,的值為。最好將閉包當(dāng)作是一個(gè)函數(shù)的入口創(chuàng)建的,而局部變量是被添加進(jìn)這個(gè)閉包的。 閉包不是魔法 這篇文章使用一些簡(jiǎn)單的代碼例子來(lái)解釋JavaScript閉包的概念,即使新手也可以輕松參透閉包的含義。 其實(shí)只要理解了核心概念,閉包并不是那么的難于理解。但是,網(wǎng)上充斥了太多學(xué)術(shù)性的文章,對(duì)于...
摘要:深入系列第八篇,介紹理論上的閉包和實(shí)踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。定義對(duì)閉包的定義為閉包是指那些能夠訪(fǎng)問(wèn)自由變量的函數(shù)。 JavaScript深入系列第八篇,介紹理論上的閉包和實(shí)踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。 定義 MDN 對(duì)閉包的定義為: 閉包是指那些能夠訪(fǎng)問(wèn)自由變量的函數(shù)。 那什么是自由變量呢? 自由變量是指在函數(shù)中使用的,但既不是函數(shù)參數(shù)也...
摘要:一言以蔽之,閉包,你就得掌握。當(dāng)函數(shù)記住并訪(fǎng)問(wèn)所在的詞法作用域,閉包就產(chǎn)生了。所以閉包才會(huì)得以實(shí)現(xiàn)。從技術(shù)上講,這就是閉包。執(zhí)行后,他的內(nèi)部作用域并不會(huì)消失,函數(shù)依然保持有作用域的閉包。 網(wǎng)上總結(jié)閉包的文章已經(jīng)爛大街了,不敢說(shuō)筆者這篇文章多么多么xxx,只是個(gè)人理解總結(jié)。各位看官瞅瞅就好,大神還希望多多指正。此篇文章總結(jié)與《JavaScript忍者秘籍》 《你不知道的JavaScri...
摘要:但是,必須強(qiáng)調(diào),閉包是一個(gè)運(yùn)行期概念。通過(guò)原型鏈可以實(shí)現(xiàn)繼承,而與閉包相關(guān)的就是作用域鏈。常理來(lái)說(shuō),一個(gè)函數(shù)執(zhí)行完畢,其執(zhí)行環(huán)境的作用域鏈會(huì)被銷(xiāo)毀。所以此時(shí),的作用域鏈雖然銷(xiāo)毀了,但是其活動(dòng)對(duì)象仍在內(nèi)存中。 學(xué)習(xí)Javascript閉包(Closure)javascript的閉包JavaScript 閉包深入理解(closure)理解 Javascript 的閉包JavaScript ...
閱讀 1330·2021-11-25 09:43
閱讀 739·2021-11-18 10:02
閱讀 2862·2021-09-07 09:59
閱讀 2748·2021-08-30 09:44
閱讀 2921·2019-08-30 13:17
閱讀 2305·2019-08-29 12:17
閱讀 1673·2019-08-28 17:57
閱讀 1281·2019-08-26 14:04