摘要:說到閉包大家可能會(huì)說函數(shù)套函數(shù),延長作用域鏈。剛開始一直不明白為什么執(zhí)行兩次的值會(huì)累加。我這屬于沒有明白函數(shù)的執(zhí)行環(huán)境及作用域鏈。
1.說到閉包大家可能會(huì)說函數(shù)套函數(shù),延長作用域鏈。對(duì)沒錯(cuò),確實(shí)是這樣的,但是你對(duì)他的理解是多少呢,函數(shù)閉包可以說的有很多,夸張的說,說個(gè)半天是絕對(duì)沒問題的,它的用處非常多,作用也非常多,這個(gè)需要你多想想的,不多說,下面我們來看代碼。
function A(){ var x = 1; return function(){ x++; console.log(x); } } var m1 = A(); m1();//2 m1();//3 var m2 = A(); m2();//2 m1();//4
剛開始一直不明白為什么m1執(zhí)行兩次x的值會(huì)累加。我這屬于沒有明白函數(shù)的執(zhí)行環(huán)境及作用域鏈。
當(dāng)m1第一次執(zhí)行時(shí)A()會(huì)在內(nèi)存中開辟一個(gè)環(huán)境,然后返回函數(shù)也會(huì)開辟一個(gè)執(zhí)行環(huán)境也就是大圈里面有個(gè)小圈,
此時(shí)小圈里的x時(shí)從大圈里拿的,然后會(huì)打印2,第二次執(zhí)行m1時(shí),由于第一次執(zhí)行m1延長作用域鏈,也就是大小圈依然存在而且里面的x=2,
此時(shí)大圈將x的值重新賦值為1,但是小圈里的x依舊是2,當(dāng)執(zhí)行到x++是,
會(huì)檢測(cè)當(dāng)前環(huán)境是否有x,答案是有此時(shí)x=2,執(zhí)行x++時(shí)就是2++,打印出來就是3,
當(dāng)將A()給了m2時(shí)又會(huì)開辟一個(gè)環(huán)境,這兩個(gè)環(huán)境并不干擾,沒有任何聯(lián)系。
以上就是我對(duì)閉包的一點(diǎn)拙見,可能有不對(duì)的地方(全憑個(gè)人亂想),請(qǐng)大佬指正!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/102866.html
摘要:之前一篇文章我們?cè)敿?xì)說明了變量對(duì)象,而這里,我們將詳細(xì)說明作用域鏈。而的作用域鏈,則同時(shí)包含了這三個(gè)變量對(duì)象,所以的執(zhí)行上下文可如下表示。下圖展示了閉包的作用域鏈。其中為當(dāng)前的函數(shù)調(diào)用棧,為當(dāng)前正在被執(zhí)行的函數(shù)的作用域鏈,為當(dāng)前的局部變量。 showImg(https://segmentfault.com/img/remote/1460000008329355);初學(xué)JavaScrip...
摘要:所以,當(dāng)在函數(shù)中使用全局變量的時(shí)候,所產(chǎn)生的代價(jià)是最大的,因?yàn)槿謱?duì)象一直處于作用域鏈的最末位置,讀取局部變量是最快的。 什么是作用域 在編程語言中,作用域控制著變量與參數(shù)的可見性及生命周期,它能減少名稱沖突,而且提供了自動(dòng)內(nèi)存管理(javascript 語言精粹) 靜態(tài)作用域 再者,js不像其他的編程語言一樣,擁有著塊級(jí)作用域,就像下面一段代碼。 function afunction...
摘要:閉包是怎么通過作用域鏈霸占更多內(nèi)存的本文是作者學(xué)習(xí)高級(jí)程序設(shè)計(jì)第一小節(jié)的一點(diǎn)個(gè)人理解,詳細(xì)教程請(qǐng)參考原教材。函數(shù)執(zhí)行過程創(chuàng)建了一個(gè)函數(shù)的活動(dòng)對(duì)象,作用域鏈的最前端指向這個(gè)對(duì)象。函數(shù)執(zhí)行完畢返回值后執(zhí)行環(huán)境作用域鏈和活動(dòng)對(duì)象一并銷毀。 JavaScript 閉包是怎么通過作用域鏈霸占更多內(nèi)存的? 本文是作者學(xué)習(xí)《JavaScript 高級(jí)程序設(shè)計(jì)》7.2第一小節(jié)的一點(diǎn)個(gè)人理解,詳細(xì)教程請(qǐng)...
摘要:執(zhí)行返回的內(nèi)部函數(shù),依然能訪問變量輸出閉包中的作用域鏈理解作用域鏈對(duì)理解閉包也很有幫助。早期的版本里采用是計(jì)數(shù)的垃圾回收機(jī)制,閉包導(dǎo)致內(nèi)存泄露的一個(gè)原因就是這個(gè)算法的一個(gè)缺陷。 關(guān)于閉包,我翻了幾遍書,看了幾遍視頻,查了一些資料,可是還是迷迷糊糊的,干脆自己動(dòng)手來個(gè)總結(jié)吧 !歡迎指正... (~ o ~)~zZ 1. 什么是閉包? 來看一些關(guān)于閉包的定義: 閉包是指有權(quán)...
摘要:前言這段時(shí)間一直在消化作用域鏈和閉包的相關(guān)知識(shí)。而作用域鏈則是這套規(guī)則這套規(guī)則的具體運(yùn)行。是變量對(duì)象的縮寫那這樣放有什么好處呢我們知道作用域鏈保證了當(dāng)前執(zhí)行環(huán)境對(duì)符合訪問權(quán)限的變量和函數(shù)的有序訪問。 前言:這段時(shí)間一直在消化作用域鏈和閉包的相關(guān)知識(shí)。之前看《JS高程》和一些技術(shù)博客,對(duì)于這些概念的論述多多少少不太清楚或者不太完整,包括一些大神的技術(shù)文章。這也給我的學(xué)習(xí)上造成了一些困惑,...
摘要:但是,必須強(qiáng)調(diào),閉包是一個(gè)運(yùn)行期概念。通過原型鏈可以實(shí)現(xiàn)繼承,而與閉包相關(guān)的就是作用域鏈。常理來說,一個(gè)函數(shù)執(zhí)行完畢,其執(zhí)行環(huán)境的作用域鏈會(huì)被銷毀。所以此時(shí),的作用域鏈雖然銷毀了,但是其活動(dòng)對(duì)象仍在內(nèi)存中。 學(xué)習(xí)Javascript閉包(Closure)javascript的閉包JavaScript 閉包深入理解(closure)理解 Javascript 的閉包JavaScript ...
閱讀 892·2021-10-13 09:39
閱讀 3542·2021-09-26 10:16
閱讀 2897·2019-08-30 15:54
閱讀 1054·2019-08-30 14:22
閱讀 2897·2019-08-29 15:39
閱讀 3266·2019-08-27 10:52
閱讀 820·2019-08-26 13:59
閱讀 1719·2019-08-26 12:20