JS閉包

JS閉包是什麼?git

首先,放一個概念:github

函數 加 函數內部能訪問到的局部變量 就組成了一個閉包windows

那閉包又有什麼做用呢?閉包

閉包經常用來「間接訪問一個變量」。換句話說,「隱藏一個變量」。函數

一般作法是 暴露一個訪問器(函數),讓別人能夠「間接訪問」那個變量。spa

有這樣一段代碼:翻譯

var i = 'i am in windows'

var test = function(){

     var a = 0;

      var  b = function(){ 

           console.log(a)

       }

       return b

}

很明顯 a 是 test 這個函數對象內的局部變量 而在其內部 b 又引用了這個對象a 這就是一個閉包code

a變量 和 b 函數對象組成了一個閉包對象

那爲何要test函數裏要再套一個b函數呢?blog

是由於須要局部變量,因此才把 a 放在一個函數裏,若是不把 a 放在一個函數裏,a 就是一個全局變量了,達不到使用閉包的目的——隱藏變量。

有些人看到「閉包」這個名字,就必定以爲要用什麼包起來才行。其實這是翻譯問題,閉包的原文是 Closure,跟「包」沒有任何關係。

因此函數套函數只是爲了造出一個局部變量,跟閉包無關。

那爲何又要 return b 呢?

由於若是不 return,你就沒法使用這個閉包。return b 的目的只是讓外面能夠訪問到這個 b 函數。

因此 return b 只是爲了 b 能被使用,也跟閉包無關。

下面看下 閉包的廬山真面目:

clipboard.png

看到了嗎 function scope 裏面出現了Closure 和 Global

Closure裏有 a 變量的值 也就是 0

那麼咱們是否能夠猜想 咱們在首行定義的全局變量 i 是否是就在Global這個 function scope 裏面?

驗證下

clipboard.png

全局變量 i 確實就在 Global裏面

其實,function scope內默認有個名爲 Globe 的全局引用(有了這個引用,就能夠直接調用 Globe 的屬性或方法)

而在Closure裏的變量或方法 外部是沒法直接訪問的

這就是 隱藏 了一個變量

by 潘小閒

參考資料:JS中的閉包是什麼

同步github

相關文章
相關標籤/搜索