1. 程式人生 > >javascript成神之路:真正理解什麼是閉包

javascript成神之路:真正理解什麼是閉包

一、閉包是什麼

在函式外部無法訪問函式內部的變數,而函式內可以訪問函式外的變數,在函式的內部,巢狀一個子函式,這個子函式可以訪問父函式作用域內的變數,然後父函式把這個子函式return出去,讓在函式外部可以通過子函式訪問自己的區域性變數,是不是有點懵呢?我們看個例子:

var x = 20;

function F() {

alert(x); // 自由變數"x" == 20

}

// 為F閉包

fooClosure = {

call: F // 引用到function

lexicalEnvironment: {x: 20} // 搜尋上下文的上下文

};

此時,“F”函式已經有了一個內部屬性——建立該函式上下文的作用域鏈。

二、閉包產生

說白了,閉包的產生就是函式內巢狀函式,例如:

var F=function(){

var a=1;

return function(){

a++;

alert(a);

}

}

var f=F();

f();

這個時候,f()能夠訪問F的內部作用域,然後把裡面的匿名函式function()本身當作一個值型別進行傳遞,其實這個閉包的產生過程可以理解為在裡面的匿名函式定義時正處於懷孕的階段,到外面f()呼叫時,小孩就出生了,這個小孩(難道是哪吒?)就是閉包。

三、特殊的閉包

有時候對函式型別的值進行引數傳遞有很多種方法,沒關係,當他們在別處被呼叫時仍然可以觀察到閉包,例如:

function F(){

var a=2;

function B(){

console.log(a);//2

}

BB(B);

}

function BB(fn){

fn();//這個就是閉包

}

//這個是把內部的函式B傳遞給BB,當呼叫這個內部函式時,它涵蓋的F()內部作用域就出來了,因為它能夠訪問a.

//閉包第二發

function W(msg){

setTimeout(function T(){

console.log(msg);

},1000);

}

W("Hello,closure!");

四、常見的閉包(專案總最經常碰到的)--迴圈閉包

for(var i=1;i<=5;i++){

(function(){

var j=i;

setTimeout(function trimer(){

console.log(j);

},j*1000);

})();

}

在for迴圈裡面,我們在每個迭代過程中都建立了一個閉包作用域,且作用域內定義了變數,進行了賦值。閉包改變了變數的生命週期,變數將得到永生。

五、閉包的作用

1、函式外部讀取函式內的區域性變數

2、儲存變數於記憶體中,避免全域性變數的汙染

有時候需要一個模組中定義這樣的變數,執行某些操作後,始終儲存上一次的值,希望這個變數一直儲存在記憶體中,但又不會汙染全域性變數,這個時候,我們就可以使用閉包,這就為什麼在不同的函式模組內定義變數名相同的識別符號,但互相之間卻又不相干擾的原因,本質上就是閉包詞法作用域在起作用

3、對外提供公有的屬性和方法(具體程式碼我就不寫了,我想大家應該有一個比較系統的瞭解了)

六、閉包的弊端或者缺點

1、由於閉包會使得函式中的變數會被儲存在記憶體中,因常駐在記憶體中,如果變數物件不使用會比較佔用記憶體,在IE8以下瀏覽器會造成記憶體洩露,解決辦法,就是在退出函式之前,將不使用的區域性變數全部刪除清空就可以了

2、如果你把父函式當做物件使用,把閉包當做它的公有方法,把內部變數當做它的私有屬性,這時候,要注意不要隨便的改變父函式的內部變數的值

七、閉包造成記憶體洩露的原因

IE8低版本瀏覽器下js引擎與DOM物件垃圾回收機制不同,js物件迴圈計數導致記憶體洩露可用閉包詞法作用域解決,js物件與DOM物件互相引用跡某些DOM操作導致記憶體洩露

相關推薦

javascript真正理解什麼是

一、閉包是什麼 在函式外部無法訪問函式內部的變數,而函式內可以訪問函式外的變數,在函式的內部,巢狀一個子函式,這個子函式可以訪問父函式作用域內的變數,然後父函式把這個子函式return出去,讓在函式外部可以通過子函式訪問自己的區域性變數,是不是有點懵呢?我們看個例子:

Java第三帖----資料結構與演算法佇列

[toc] # 資料結構與演算法--佇列 ***今天掉了兩根頭髮,摸掉的,記得 別亂摸,很珍貴的!!*** ## 什麼是佇列? 1)佇列是一個有序列表,可以用陣列或是連結串列來實現 2)遵循 ***先入先出*** 的原則。即:先存入佇列的資料,要先取出。後存入的要後取出 3)示意圖:(使用陣列模擬佇

Java技術整理(長期更新)

重復註解 java多線程 加載機制 rom 倒計時器 dad 免費 dcm servle 以下是Java技術棧微信公眾號發布的關於 Java 的技術幹貨,從以下幾個方面匯總。 Java 基礎篇 Java 集合篇 Java 多線程篇 Java JVM篇 Java 進階篇 J

Java工程師思維導圖

思維 ava inf png 更新 時間 nbsp 微信 bubuko   前面看Hollis的微信公眾號更新了Java工程師成神之路的文檔,想著有時間把它畫下來,畫下來之後分享出來: 主要內容: 基礎篇: 進階篇: 高級篇: 推薦書籍:

算法,請看這一篇!

啊哈算法 算法題 美的 結構 編程之美 學習編程 字符 不同 痛苦 隨著自己寫的越來越多,慢慢的就會有人和我主動交流,現在好多人希望我寫一篇考研、就業的選擇、零基礎如何學習編程,秋招如何選擇offer、等等 我以前寫過一篇初入阿裏---10 天,我自己還想寫一篇在阿裏的

《Java工程師-基礎篇》Java基礎知識——序列化(已完結)

本文是《成神之路系列文章》中的一篇,主要是關於Java中序列化的一些介紹。 持續更新中 Java物件的序列化與反序列化 深入分析Java的序列化與反序列化 單例與序列化的那些事兒 Google Protocol Buffer 的使用和原理 拓展內容 關於 Java

系列文章》

Java工程師成神之路一文介紹了一個普通的Java工程師想要成神需要學習的所有相關知識點。很多內容介紹都是直接拋了一個連結,並且大部分都是英文文件或者相關技術的官網。 本系列文章主要從頭開始總結Java工程師成神之路一文中介紹的所有知識點。 程式設計屆有一句老話,叫做不要重複造輪子。雖然我並不完全認同這句

-基礎篇》JVM——Java記憶體模型(已完結)

Java記憶體模型 本文是《成神之路系列文章》的第一篇,主要是關於JVM的一些介紹。 持續更新中 Java記憶體模型 JVM記憶體結構 VS Java記憶體模型 VS Java物件模型(Hollis原創) 再有人問你Java記憶體模型是什麼,就把這篇文章發給他。(Hollis原創) 記

Java(2018版)

一、基礎篇 1. Java基礎知識 知識點 連結地址 Java快速入門 資源連結 IntelliJ IDEA教程 資源連結 JAVA程式設計思想指

Java(2018版)

一、基礎篇 1. Java基礎知識 知識點 連結地址 Java快速入門 資源連結 IntelliJ IDEA教程 資源連結 JAVA程式設計思想指導 資源連結 Java8新特性 資源連結 2. Java Web 知識點 連結地址 Java Web進階:資料庫與My

—軟體實施到底是做什麼的

1、 安裝軟體。什麼是安裝軟體? 舉個例子來說,隔壁王叔叔最近迷戀上微信了,但是你媽媽不會玩,也不會下載,你就要教你媽怎麼在她的Iphone4S上安裝微信。 安裝軟體就是給企業使用者安裝自己公司的產品,部署的伺服器上,能夠讓軟體流暢的執行起來。 2、 軟體測試? 微信剛出來

Java工程師(2018修訂版)

主要版本 更新時間 備註 v1.0 2015-08-01 首次釋出 v1.1 2018-03-12 增加新技術知識、完善知識體系 一、基礎篇 JVM JVM記憶體結構 堆、棧、方法區、直接記憶體、堆和棧區別 Java記憶

~

Java成神之路 一、基礎篇 JVM JVM記憶體結構 堆、棧、方法區、直接記憶體、堆和棧區別 Java記憶體模型 記憶體可見性、重排序、順序一致性、volatile、鎖、final 垃圾回收 記憶體分配策略、垃圾收集器(G1)、GC演算法、GC引數、物件存活的判定

JVM記憶體結構(Java 工程師·基礎篇·JVM)

第一章 JVM記憶體結構 第一章 JVM記憶體結構 為什麼要了解JVM記憶體管理機制 JVM自動的管理記憶體的分配與回收,這會在不知不覺中浪費很多記憶體,導致JVM花費很多時間去進行垃圾回收(GC) 記憶體洩露,導致JVM記憶體最終不夠用 JVM記憶體結構

Java技術整理

   關於 Java 的技術乾貨,從以下幾個方面彙總。   Java 基礎篇   Java 集合篇   Java 多執行緒篇   Java JVM篇   Java 進階篇   Java 新特性篇   Java 工具篇   Java 書籍篇   Java基礎篇   8張圖帶你輕鬆溫習 Ja

Java工程師的(年薪百萬不是夢!)

一、基礎篇JVMJVM記憶體結構堆、棧、方法區、直接記憶體、堆和棧區別Java記憶體模型記憶體可見性、重排序、順序一致性、volatile、鎖、final垃圾回收記憶體分配策略、垃圾收集器(G1)、GC演算法、GC引數、物件存活的判定JVM引數及調優Java物件模型oop-k

Java 工程師

http://www.hollischuang.com/archives/489https://linux.cn/article-6739-1.html 一、基礎篇 1.1 JVM 1.1.1. Java記憶體模型,Java記憶體管理,Java堆和棧,垃圾回收 1.

Java工程師

一、基礎篇 1.1 JVM 1.1.1. Java記憶體模型,Java記憶體管理,Java堆和棧,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133 http://ifeve.com/jmm-faq/ 1.1.2. 瞭解J

Java[轉]

阿里大牛珍藏架構資料,點選連結免費獲取 針對本文,博主最近在寫《成神之路系列文章》 ,分章分節介紹所有知識點。歡迎關注。 主要版本 更新時間 備註 v1.0 2015-08-01

【收藏篇】Java工程師

一、基礎篇 1.1 JVM 1.1.1. Java記憶體模型,Java記憶體管理,Java堆和棧,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133http://ifeve.com/jmm-faq/ 1.1.2. 瞭解JVM各種引數及調優 1.1.3