**什麼是閉包?**
閉包是指全部可以讀取其餘函數內部變量的函數。在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
那麼閉包的特色是什麼呢?內存
所以使用閉包時要注意不能濫用,可能形成性能較差,ie中出現內存泄露等問題。所以在退出函數時,能夠經過刪除不常使用的常量來緩解這一狀況。作用域