談談我對閉包的理解

閉包

定義

在MDN上的定義爲:函數和對其周圍環境的引用捆綁在一塊兒構成閉包,可讓使用者從函數內部訪問外部函數的做用域。閉包

  • 定義中的周圍環境指的是詞法環境或者叫詞法做用域。做用爲根據源代碼中聲明變量的位置來肯定該變量在何處可用。

所以,閉包能夠通俗的理解爲:函數與函數內部能訪問到的變量的總和。函數

形如code

function funA(){  
 var a = 10;  
 return function(){  
 console.log(a)  
 }  
}  
​  
var b = funA();  
b();

做用

  1. 能夠在函數的外部訪問到函數內部的局部變量
  2. 可讓這些變量始終保存在內存中,不會隨着函數的結束而自動銷燬

閉包爲何存在

其做用就是閉包存在的意義。內存

首先,JS和其餘語言同樣,擁有做用域,其最大的做用就是隔離變量。而且做用域存在上下級關係,由函數是在哪一個做用域下建立所肯定。作用域

變量取值的過程是先在當前做用域查找值,若是沒有則會跳轉到上級做用域查找,若是找到就中止,未查找到這繼續查找上級做用域直到全局做用域中。io

var a = 10;
function fn(){
    var b = 20;
    function bar(){
        console.log(a + b)
    }
    return bar
}

var x = fn(),
    b = 200;
x() //值爲10+20=30

變量取值的過程就像一個單向鏈表,只能從當前做用域開始向上級做用域查找,所以咱們也將這個查找過程稱爲做用域鏈。console

從上面能夠看到,函數內部能夠訪問到外部的變量,而外部沒法訪問到內部做用域的變量。因此在某些狀況下,咱們不想某個變量直接暴露,就將這個變量保存在函數中,使其變爲局部變量,再使用閉包將其「間接暴露」。function

(function countNum(){
    var num = 0;
    window.addNUm = function (){
        num++;
        console.log(num)
    }
    window.reduceNum = function (){
        num--;
        console.log(num)
    }
}())

在這個例子中,要想改變num的值,只能經過addNumreduceNum兩個函數。變量

相關文章
相關標籤/搜索