今天,我們來(lái)初步了解一下作用域和閉包的相關(guān)知識(shí)點(diǎn),因?yàn)槭浅醪搅私猓胁粫?huì)深入,不會(huì)太難,希望對(duì)大家有所幫助。

作用域是什么?
說(shuō)白了,作用域就是一個(gè)代碼區(qū)域,或者也可以理解成為一個(gè)運(yùn)行環(huán)境。
JS中有兩種作用域,全局作用域和函數(shù)作用域。
// window環(huán)境 var a = 123; var b = 234; var c = 456; //函數(shù)作用域 function A(){ var a = 123; var b = 234; var c = 456; } A();
全局作用域:直接在腳本中寫代碼,在全局作用域中聲明得變量,會(huì)提升到腳本頂部,并成為window屬性。(前幾節(jié)中有涉及)
函數(shù)作用域:在函數(shù)中書(shū)寫代碼,聲明的變量會(huì)提升到函數(shù)的頂部,不會(huì)成為全局屬性,在函數(shù)內(nèi)部聲明的變量不會(huì)污染全局變量。
因此,在編程過(guò)程中,盡可能的將功能封裝在函數(shù)中。
立即執(zhí)行函數(shù)(IIFE)
當(dāng)函數(shù)成為一個(gè)表達(dá)式的時(shí)候,既不會(huì)提升,也不會(huì)污染全局變量。
將函數(shù)變成表達(dá)式的方法之一,就是用小括號(hào)就函數(shù)包裹起來(lái)。代碼如下:
( function 函數(shù)名(){ 函數(shù)體; })
如此一來(lái),這樣的函數(shù)就無(wú)法通過(guò)函數(shù)名來(lái)調(diào)用了。
如果,函數(shù)作為表達(dá)式并且立即調(diào)用,這樣的函數(shù)就被成為立即實(shí)行函數(shù):
( function 函數(shù)名(){ 函數(shù)體; })(); ( function 函數(shù)名(){ 函數(shù)體; }());
調(diào)用的小括號(hào)可以在里也可以在外。
由于大部分情況下,函數(shù)的函數(shù)名不起作用,因此,立即執(zhí)行函數(shù)一般不書(shū)寫函數(shù)名,沒(méi)有函數(shù)名的函數(shù),稱之為匿名函數(shù)。
作用中可以使用的變量
在全局作用域下只能使用全局作用中聲明的變量(包括函數(shù))。
在函數(shù)作用域下,既可以使用函數(shù)作用域中聲明的變量,也可以使用外部環(huán)境中聲明的變量(包括函數(shù))。
var a = 123; console.log(a);打印出來(lái)123 function A(){ console.log(a);//也可以打印出來(lái)123; var b = 234; } A(); console.log(b);//這里會(huì)報(bào)錯(cuò),因?yàn)閎未定義。

內(nèi)部變量和外部變量沖突的時(shí)候,使用內(nèi)部變量,在內(nèi)部沒(méi)有的情況下,依次向外層環(huán)境中找。
內(nèi)部可以使用外部,但外部不可能使用內(nèi)部的(你的就是我的,我的還是我的)。
初探閉包
從嚴(yán)格意義上來(lái)講,閉包是一種現(xiàn)象。
閉包就是內(nèi)部函數(shù)可以使用外部函數(shù)環(huán)境中的變量。
天就講到這里,關(guān)于閉包的知識(shí),后期會(huì)進(jìn)行詳細(xì)的解說(shuō)。