淺析js閉包

**什麼是閉包?**

閉包是指全部可以讀取其餘函數內部變量的函數。在JavaScript中,變量只有兩種,全局變量和局部變量。區別在於任何函數均可以直接對全局變量進行訪問,而局部變量則只有當前函數以及定義在該函數內部的函數能夠進行訪問。閉包

訪問全局變量以下:函數

var a = 1;
function show() {
    console.log(a);
};

var showTest = show(); //1 此時函數訪問的是全局變量a

可是若是是在函數內部定義了變量a,那麼在函數外部是不可訪問的。這裏要注意的是定義局部變量必須加上var,不然定義了全局變量a。性能

function show() {
    var a = 100;
};

console.log(a) //此時會報錯,a未定義

那麼想訪問函數內部的變量a有什麼方法呢,不考慮直接返回變量a的狀況。由於內部函數能夠經過做用域鏈訪問到父函數的局部變量,那咱們是否是能夠在函數內部定義一個函數來讀取a呢?code

function show() {
    var a = 100;
    var inShow = function() {
        console.log(a);
    };
    return inShow;
};

var showTest = show();
showTest(); //100

這就是閉包,經過內部函數訪問父函數的變量,再經過返回內部函數,使能夠在外部訪問函數的局部變量。上面也能夠這樣實現ip

function show() {
    var a = 100;
    return function() {
        console.log(a);
    };
};

var showTest = show();
showTest(); //100

那麼閉包的特色是什麼呢?內存

  1. 首先是以前一直在強調的能夠訪問一個函數的局部變量。
  2. 可使變量一直存在內存中。怎麼理解呢?如上例子中,咱們經過返回inShow函數,並將其賦值給一個全局變量showTest,從而使得函數inShow一直存在內存中,而inShow是函數show的內部函數,因此函數show也存在內存中,不會被銷燬。

所以使用閉包時要注意不能濫用,可能形成性能較差,ie中出現內存泄露等問題。所以在退出函數時,能夠經過刪除不常使用的常量來緩解這一狀況。作用域

相關文章
相關標籤/搜索