淺析 JavaScript 中的閉包(Closures)
一、前言
對于 JavaScript 來說,閉包是一個非常強大的特征。但對于剛開始接觸的初學(xué)者來說它又似乎是特別高深的。今天我們一起來揭開閉包的神秘面紗。閉包這一塊也有很多的文章介紹過了,今天我就淺談一下自己對閉包的的一些理解,希望能提供一點鄙陋的見解幫助到正在學(xué)習(xí)的朋友。該文章中能使用口語化的我將盡量使用口語化的敘述方式,希望能讓讀者更好理解,畢竟文章寫出來宗旨就是要讓人讀懂。文章難免有不足之處還希望幫忙指出。
二、Javascript 的作用域鏈
在了解閉包之前,我們先來看看幾個準(zhǔn)備知識。
-
變量的作用域
首先,什么是作用域?域,區(qū)域。簡單來理解就是一個變量能被訪問的范圍(區(qū)域)。換言之就是這個變量能起作用的區(qū)域。按這個標(biāo)準(zhǔn)來劃分我們將變量分為 全局變量 和 局部變量 兩種
以定義的方式來區(qū)分有以下特點:
定義在函數(shù)內(nèi)部的變量是局部變量,定義在函數(shù)外部的變量是全局變量。(這個并不只是 Javascript 語言的特點)局部變量在函數(shù)內(nèi)部能被訪問,在函數(shù)外部不能被直接訪問,所以局部變量就是從定義它的地方開始到函數(shù)結(jié)束的位置結(jié)束。當(dāng)然這里有個細(xì)節(jié)--變量提升。等下我們用一小段代碼提一下函數(shù)提升是什么。我們先來看看局部變量和全局變量的代碼
var a = 0; function testFunc(){ var b = 1; console.log('-------------函數(shù)內(nèi)輸出-------------'); console.log(a);//0 console.log(b);//1 }