亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

一篇文章搞懂閉包。

tinyq / 1828人閱讀

摘要:如果非要用一句話定義閉包我更加認(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

相關(guān)文章

  • 搞懂閉包

    摘要:此時閉包函數(shù)的作用域鏈得以保存,不會被垃圾回收機制所回收。執(zhí)行執(zhí)行完畢,返回總結(jié)閉包的原理,就是把閉包函數(shù)的作用域鏈保存了下來。 原文:搞懂閉包 | AlloyTeam作者:TAT.yaoyao 閉包這個概念是前端工程師必須要深刻理解的,但是網(wǎng)上確實有一些文章會讓初學(xué)者覺得晦澀難懂,而且閉包的文章描述不一。 本文面向初級的程序員,聊一聊我對閉包的理解。當(dāng)然如果你看到閉包聯(lián)想不到作用域鏈...

    masturbator 評論0 收藏0
  • 搞懂JavaScript引擎運行原理

    摘要:同步一次執(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...

    lastSeries 評論0 收藏0
  • 作用域閉包,你真的懂了嗎?

    摘要:曾幾何時,閉包好像就是一個十分難以捉摸透的東西,看了很多文章,對閉包都各有說法,以致讓我十分暈,什么內(nèi)部變量外部變量的,而且大多數(shù)都只描述一個過程,沒有給閉包的定義,最后,舉幾個例子,告訴你這就是閉包。 曾幾何時,閉包好像就是一個十分難以捉摸透的東西,看了很多文章,對閉包都各有說法,以致讓我十分暈,什么內(nèi)部變量、外部變量的,而且大多數(shù)都只描述一個過程,沒有給閉包的定義,最后,舉幾個例子...

    yangrd 評論0 收藏0
  • vue.js源碼 - 剖析observer,dep,watch三者關(guān)系 如何具體的實現(xiàn)數(shù)據(jù)雙向綁定

    摘要:雙向數(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...

    mo0n1andin 評論0 收藏0
  • 前端基礎(chǔ)進階(四):詳細圖解作用域鏈與閉包

    摘要:之前一篇文章我們詳細說明了變量對象,而這里,我們將詳細說明作用域鏈。而的作用域鏈,則同時包含了這三個變量對象,所以的執(zhí)行上下文可如下表示。下圖展示了閉包的作用域鏈。其中為當(dāng)前的函數(shù)調(diào)用棧,為當(dāng)前正在被執(zhí)行的函數(shù)的作用域鏈,為當(dāng)前的局部變量。 showImg(https://segmentfault.com/img/remote/1460000008329355);初學(xué)JavaScrip...

    aikin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<