淺談JavaScript中閉包

  借用高程(JavaScript高級程序設計)中對閉包的定義:閉包是指有權訪問另外一個函數做用域中的變量的函數。而我想對這句話加一個修飾條件就更能反應閉包的含義了。
  閉包是指在任何地方都有權訪問另外一個函數做用域中的變量的函數。
因此,一般咱們會在一個函數裏return另外一個函數,這樣更能體現 在任何地方,有權訪問另外一個函數(外層函數)中的變量。html

下面咱們能夠經過一張圖來更加直觀的理解下,閉包函數爲什麼能在任何地方都有權訪問外層函數內部的變量。閉包

  咱們都知道,控制變量的訪問權限這是做用域鏈的職責(能夠參考個人博客),從上圖中,咱們能夠看出,閉包函數 bibao 的內部屬性 [[Scopes]] 上記錄了定義當前函數時的做用域鏈,當執行bibao函數時,會將[[Scopes]]屬性取出生成一個做用域鏈而且將當前函數的活動對象推入做用域鏈的最頂層,這樣,無論在什麼位置就都能訪問內部函數的屬性,如圖中的 k 變量。函數

  ⚠️注意,當內部函數沒有指向或者引用內部函數中的變量時,這個時候,內部函數是不會構成閉包的,請參考下圖。spa

 

  如上圖所示,閉包函數內部屬性 [[Scopes]] 中沒有外層函數的活動對象,因此執行該函數時沒法訪問外層函數的變量 k。所以,當內層函數中沒有引用外層函數中的變量時,就不會構成一個閉包函數。設計

相關文章
相關標籤/搜索