摘要:如果非要用一句話定義閉包我更加認(rèn)同你不知道的作者的一句話當(dāng)函數(shù)可以記住并訪問(wèn)所在的詞法作用域時(shí),就產(chǎn)生了閉包。所以本文將會(huì)從閉包的應(yīng)用場(chǎng)景入手,來(lái)印證的這句話??偨Y(jié)閉包的應(yīng)用場(chǎng)景還有很多,可以說(shuō)是隨處可見(jiàn)了。
直接進(jìn)入主題,閉包是什么?
閉包是寫(xiě)代碼過(guò)程產(chǎn)生的一種自然結(jié)果,而不是一種概念。
相比于一些概念性的解釋?zhuān)匾氖鞘煜に膽?yīng)用場(chǎng)景、及常見(jiàn)寫(xiě)法。
如果非要用一句話定義閉包:
我更加認(rèn)同《你不知道的javaScript》作者的一句話:當(dāng)函數(shù)可以記住并訪問(wèn)所在的詞法作用域時(shí),就產(chǎn)生了閉包。
所以本文將會(huì)從閉包的應(yīng)用場(chǎng)景入手,來(lái)印證kyle simpson的這句話。
列舉兩個(gè)常見(jiàn)應(yīng)用場(chǎng)景
場(chǎng)景一:封裝函數(shù)的私有屬性和方法
//local變量是foo函數(shù)的私有屬性,只能通過(guò)bar函數(shù)來(lái)訪問(wèn)。 function foo() { const local = 1 function bar() { return local } return bar } let bar = foo() console.log(bar()) // 1
bar函數(shù)記住了foo函數(shù)的詞法作用域,導(dǎo)致foo函數(shù)運(yùn)行完后并不會(huì)被垃圾回收,我們可以通過(guò)bar函數(shù)盡情地訪問(wèn)foo函數(shù)的作用域。
場(chǎng)景二:給10個(gè)li添加點(diǎn)擊事件
// 錯(cuò)誤寫(xiě)法: function bindEvent() { var li = document.querySelectorAll("li") for(var i = 0; i < 10; i++) { li[i].addEventListener("click", function bar(){ console.log(i) }) } } bindEvent() //無(wú)論點(diǎn)擊哪個(gè)li,都會(huì)打印出10
錯(cuò)誤的原因很明顯,10個(gè)bar函數(shù)中的i訪問(wèn)的都是同一個(gè)i,這個(gè)i屬于foo函數(shù)。
// 正確寫(xiě)法: function bindEvent() { var li = document.querySelectorAll("li") for(var i = 0; i < 10; i++) { li[i].addEventListener("click", (function foo(j){ return bar() { console.log(j) } }))(i) } } bindEvent()
bar函數(shù)記住了foo函數(shù)的詞法作用域,foo函數(shù)為每個(gè)bar函數(shù)選好了屬于它自己的i,等著bar去訪問(wèn)就好啦。
總結(jié):閉包的應(yīng)用場(chǎng)景還有很多,可以說(shuō)是隨處可見(jiàn)了。
理解它的核心思想:函數(shù)可以記住并訪問(wèn)所在的詞法作用域,才可以根據(jù)你自己的意愿來(lái)識(shí)別、擁抱和影響閉包的思維環(huán)境。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99944.html
摘要:此時(shí)閉包函數(shù)的作用域鏈得以保存,不會(huì)被垃圾回收機(jī)制所回收。執(zhí)行執(zhí)行完畢,返回總結(jié)閉包的原理,就是把閉包函數(shù)的作用域鏈保存了下來(lái)。 原文:搞懂閉包 | AlloyTeam作者:TAT.yaoyao 閉包這個(gè)概念是前端工程師必須要深刻理解的,但是網(wǎng)上確實(shí)有一些文章會(huì)讓初學(xué)者覺(jué)得晦澀難懂,而且閉包的文章描述不一。 本文面向初級(jí)的程序員,聊一聊我對(duì)閉包的理解。當(dāng)然如果你看到閉包聯(lián)想不到作用域鏈...
摘要:同步一次執(zhí)行一件事,同步引擎一次只執(zhí)行一行,是同步的。調(diào)用函數(shù)將其推入堆棧并從函數(shù)返回將其彈出堆棧。執(zhí)行上下文當(dāng)函數(shù)放入到調(diào)用堆棧時(shí)由創(chuàng)建的環(huán)境。執(zhí)行結(jié)果它會(huì)立即被推到回調(diào)隊(duì)列,但它仍然會(huì)等待調(diào)用堆棧為空才會(huì)執(zhí)行。 為了保證可讀性,本文采用意譯而非直譯。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 一些名詞 JS引擎 — 一個(gè)讀取代碼并運(yùn)行的引擎,沒(méi)有單一的J...
摘要:曾幾何時(shí),閉包好像就是一個(gè)十分難以捉摸透的東西,看了很多文章,對(duì)閉包都各有說(shuō)法,以致讓我十分暈,什么內(nèi)部變量外部變量的,而且大多數(shù)都只描述一個(gè)過(guò)程,沒(méi)有給閉包的定義,最后,舉幾個(gè)例子,告訴你這就是閉包。 曾幾何時(shí),閉包好像就是一個(gè)十分難以捉摸透的東西,看了很多文章,對(duì)閉包都各有說(shuō)法,以致讓我十分暈,什么內(nèi)部變量、外部變量的,而且大多數(shù)都只描述一個(gè)過(guò)程,沒(méi)有給閉包的定義,最后,舉幾個(gè)例子...
摘要:雙向數(shù)據(jù)綁定的核心和基礎(chǔ)是其內(nèi)部真正參與數(shù)據(jù)雙向綁定流程的主要有和基于和發(fā)布者訂閱者模式,最終實(shí)現(xiàn)數(shù)據(jù)的雙向綁定。在這里把雙向數(shù)據(jù)綁定分為兩個(gè)流程收集依賴(lài)流程依賴(lài)收集會(huì)經(jīng)過(guò)以上流程,最終數(shù)組中存放列表,數(shù)組中存放列表。 Vue雙向數(shù)據(jù)綁定的核心和基礎(chǔ)api是Object.defineProperty,其內(nèi)部真正參與數(shù)據(jù)雙向綁定流程的主要有Obderver、Dep和Watcher,基于d...
摘要:之前一篇文章我們?cè)敿?xì)說(shuō)明了變量對(duì)象,而這里,我們將詳細(xì)說(shuō)明作用域鏈。而的作用域鏈,則同時(shí)包含了這三個(gè)變量對(duì)象,所以的執(zhí)行上下文可如下表示。下圖展示了閉包的作用域鏈。其中為當(dāng)前的函數(shù)調(diào)用棧,為當(dāng)前正在被執(zhí)行的函數(shù)的作用域鏈,為當(dāng)前的局部變量。 showImg(https://segmentfault.com/img/remote/1460000008329355);初學(xué)JavaScrip...
閱讀 1639·2021-11-02 14:42
閱讀 534·2021-10-18 13:24
閱讀 973·2021-10-12 10:12
閱讀 1827·2021-09-02 15:41
閱讀 3216·2019-08-30 15:56
閱讀 2886·2019-08-29 16:09
閱讀 2067·2019-08-29 11:13
閱讀 3632·2019-08-28 18:06