js 作用域鏈

1、JavaScript的作用域鏈

首先看下下面這段代碼:

var rain = 1;

function rainman(){

? ? var man = 2;

? ? function inner(){

? ? ? ? var innerVar = 4;

? ? ? ? alert(rain);

? ? }

? ? inner();? ? //調(diào)用inner函數(shù)

}

rainman();? ? //調(diào)用rainman函數(shù)

觀察alert(rain);這句代碼。JavaScript首先在inner函數(shù)中查找是否定義了變量rain,如果定義了則使用inner函數(shù)中的rain變量;如果inner函數(shù)中沒(méi)有定義rain變量,JavaScript則會(huì)繼續(xù)在rainman函數(shù)中查找是否定義了rain變量,在這段代碼中rainman函數(shù)體內(nèi)沒(méi)有定義rain變量,則JavaScript引擎會(huì)繼續(xù)向上(全局對(duì)象)查找是否定義了rain;在全局對(duì)象中我們定義了rain = 1,因此最終結(jié)果會(huì)彈出'1'。

作用域鏈:JavaScript需要查詢一個(gè)變量x時(shí),首先會(huì)查找作用域鏈的第一個(gè)對(duì)象,如果以第一個(gè)對(duì)象沒(méi)有定義x變量,JavaScript會(huì)繼續(xù)查找有沒(méi)有定義x變量,如果第二個(gè)對(duì)象沒(méi)有定義則會(huì)繼續(xù)查找,以此類推。

上面的代碼涉及到了三個(gè)作用域鏈對(duì)象,依次是:inner、rainman、window。


2、函數(shù)體內(nèi)部,局部變量的優(yōu)先級(jí)比同名的全局變量高。

var rain = 1;? ? //定義全局變量 rain

function check(){

? ? var rain = 100;? ? //定義局部變量rain

? ? alert( rain );? ? ? //這里會(huì)彈出 100

}

check();

alert( rain );? ? //這里會(huì)彈出1


3、未使用var關(guān)鍵字定義的變量都是全局變量。全局變量都是window對(duì)象的屬性。



理解:內(nèi)部環(huán)境可以通過(guò)作用域鏈訪問(wèn)所有的外部環(huán)境,但是外部環(huán)境不能訪問(wèn)內(nèi)部環(huán)境中的任何變量和函數(shù)。 這些環(huán)境之間的聯(lián)系是線性的、有次序的。

但是有一類可以訪問(wèn)到內(nèi)部的變量,這種方式被稱作閉包。一個(gè)局部變量會(huì)在函數(shù)執(zhí)行開(kāi)始時(shí)候被初始化,函數(shù)結(jié)束時(shí)銷毀,但是如果在局部變量外部引用到了函數(shù)內(nèi)部的變量,此時(shí)這個(gè)函數(shù)就不會(huì)被銷毀了,這也是為什么閉包內(nèi)部的變量一直都存在在內(nèi)存的原因。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 之前寫(xiě)過(guò)一篇JavaScript 閉包究竟是什么的文章理解閉包,覺(jué)得寫(xiě)得很清晰,可以簡(jiǎn)單理解閉包產(chǎn)生原因,但看評(píng)論...
    寧驥閱讀 386評(píng)論 0 1
  • 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別? 1.聲明的函數(shù)foo將會(huì)在執(zhí)行前提升,因此foo在函數(shù)上下文都是可以被調(diào)用的,即...
    小囧兔閱讀 333評(píng)論 0 1
  • 大家好,我是IT修真院成都分院第三期的學(xué)員,一枚正直純潔善良的web程序員今天給大家分享一下,修真院官網(wǎng)js任務(wù)4...
    取老夫的草莓蛋糕來(lái)閱讀 262評(píng)論 0 2
  • 給出兩個(gè)不同的例子: 范例1: 分析上面代碼:全局作用域中定義了變量x,function foo()以及funct...
    DeeJay_Y閱讀 361評(píng)論 0 1
  • 第一章: JS簡(jiǎn)介 從當(dāng)初簡(jiǎn)單的語(yǔ)言,變成了現(xiàn)在能夠處理復(fù)雜計(jì)算和交互,擁有閉包、匿名函數(shù), 甚至元編程等...
    LaBaby_閱讀 1,761評(píng)論 0 6

友情鏈接更多精彩內(nèi)容