麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > JS > 正文

前端開發必須知道的JS之閉包及應用

2024-09-06 12:45:25
字體:
來源:轉載
供稿:網友
在前端開發必須知道的JS之原型和繼承一文中說過下面寫篇閉包,加之最近越來越發現需要加強我的閉包應用能力,所以此文不能再拖了。本文講的是函數閉包,不涉及對象閉包(如用with實現)。如果你覺得我說的有偏差,歡迎拍磚,歡迎指教。
一. 閉包的理論
  首先必須了解以下幾個概念:

  執行環境
  每調用一個函數時(執行函數時),系統會為該函數創建一個封閉的局部的運行環境,即該函數的執行環境。函數總是在自己的執行環境中執行,如讀寫局部變量、函數參數、運行內部邏輯。創建執行環境的過程包含了創建函數的作用域,函數也是在自己的作用域下執行的。從另一個角度說,每個函數執行環境都有一個作用域鏈,子函數的作用域鏈包括它的父函數的作用域鏈。關于作用域、作用域鏈請看下面。

  作用域、作用域鏈、調用對象
  函數作用域分為詞法作用域和動態作用域。
  詞法作用域是函數定義時的作用域,即靜態作用域。當一個函數定義時,他的詞法作用域就確定了,詞法作用域說明的是在函數結構的嵌套關系下,函數作用的范圍。這個時候也就形成了該函數的作用域鏈。作用域鏈就是把這些具有嵌套層級關系的作用域串聯起來。函數的內部[[scope]]屬性指向了該作用域鏈。
  動態作用域是函數調用執行時的作用域。當一個函數被調用時,首先將函數內部[[scope]]屬性指向了函數的作用域鏈,然后會創建一個調用對象,并用該調用對象記錄函數參數和函數的局部變量,將其置于作用域鏈頂部。動態作用域就是通過把該調用對象加到作用域鏈的頂部來創建的,此時的[[scope]]除了具有定義時的作用域鏈,還具有了調用時創建的調用對象。換句話說,執行環境下的作用域等于該函數定義時就確定的作用域鏈加上該函數剛剛創建的調用對象,從而也形成了新的作用域鏈。所以說是動態的作用域,并且作用域鏈也隨之發生了變化。再看這里的作用域,其實是一個對象鏈,這些對象就是函數調用時創建的調用對象,以及他上面一層層的調用對象直到最上層的全局對象。 
  譬如全局環境下的函數A內嵌套了一個函數B,則該函數B的作用域鏈就是:函數B的作用域—>函數A的作用域—>全局window的作用域。當函數B調用時,尋找某標識符,會按函數B的作用域—>函數A的作用域—>全局window的作用域去尋找,實際上是按函數B的調用對象—>函數A的調用對象—>全局對象這個順序去尋找的。也就是說當函數調用時,函數的作用域鏈實際上是調用對象鏈。

  閉包
  在動態執行環境中,數據實時地發生變化,為了保持這些非持久型變量的值,我們用閉包這種載體來存儲這些動態數據(看完下面的應用就會很好的體會這句話)。閉包的定義:所謂“閉包”,指的是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成人18在线 | 天天草天天干天天射 | 精品国产乱码久久久久久丨区2区 | 国产精品一区二区三区在线播放 | 国产 日韩 一区 | 午夜色视频在线观看 | 久久影库 | 龙床上的呻吟高h | 91一区二区在线观看 | 免费观看又色又爽又黄的崩锅 | 九九精品在线观看视频 | h色网站免费观看 | 久久华人 | 久久成人国产精品 | 最新se94se在线欧美 | 久久久久久免费免费 | 欧美成人激情在线 | 中文字幕网在线 | 亚洲性生活视频 | 久久精品小短片 | 91短视频在线播放 | 国产91精品久久久久久 | h视频免费观看 | 看一级毛片 | 成人免费看毛片 | 91在线视频播放 | 亚洲第一成人在线观看 | 全黄裸片武则天一级第4季 偿还电影免费看 | 91色琪琪电影亚洲精品久久 | 国产亚洲精品一区二区三区 | 在线天堂中文字幕 | 免费视频a | 久久人人爽人人爽人人片av高请 | jizzjizzjizz少妇 | 日本在线视频一区二区三区 | 特级a欧美做爰片毛片 | 91丨九色丨国产在线观看 | 狼人狠狠干 | 免费在线观看毛片 | 亚洲视频网 | 欧美日韩一 |