javascript閉包概念介紹

antzone發表於2017-04-10

閉包是javascript中一個比較重要的概念,如果說javascript有很多的入門標準的話,那麼閉包就算做是其中的一個。

下面就介紹一下javascript閉包的相關概念,需要的朋友可以做一下參考。

在閱讀本文之前,最好參閱以下幾篇文章,如果已經掌握可以略過。

(1).javascript執行上下文詳解一章節。

(2).javascript變數物件詳解一章節。

(3).javascript 作用域和作用域鏈詳解一章節。

在javascript中,函式function是一個物件,它既可以作為一個函式的引數,也可以作為一個函式的返回值。

上面的這個特點,在閉包中就會經常的被用到,下面先給出閉包的概念:

[JavaScript] 純文字檢視 複製程式碼
閉包就是能訪問另一個函式作用域中變數的函式。

看如下程式碼例項:

[JavaScript] 純文字檢視 複製程式碼
function func() {
  var webName = "螞蟻部落";
  function funA() {
    console.log(webName);
  }
  return funA;
}
var foo = func();
foo();

上面的程式碼就形成了一個閉包,函式funA被當做返回值返回,並賦值給變數foo。

當呼叫此返回函式的時候,依然可以輸出func函式中宣告的變數webName。

按照通常的道理,當一個函式執行完畢以後,它就會被銷燬,那麼它的變數就無法再訪問了。

之所以能夠進行訪問,就是因為作用域鏈的原因導致的。

在進入上下文階段,函式宣告會儲存在變數/活躍物件中(VO/AO),每一個函式都會有一個[[Scope]]指標,它指向是一個包含了所有上層變數物件的堆疊,[[Scope]]是在函式建立的時候儲存起來的,並且以後永不會改變,直到被銷燬。那麼就以上面為例,雖然func() 執行完畢以後,它的內部的變數和作用域鏈被銷燬,但是函式funcA由於被全域性變數foo所引用,所以它不會被效果,它的作用域鏈也就不會被銷燬,那麼所指向的變數物件就依然存在,於是webName就是可訪問的。

相關文章