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