JS的作用域與var的優(yōu)先級(jí)
函數(shù)作用域

在函數(shù)中定義變量a 在函數(shù)外打印是打印不出結(jié)果的.這里要提到作用域鏈,作用域鏈的本質(zhì)是內(nèi)部可以訪問外部的變量,而外部不能訪問內(nèi)部的變量.可以打印出來a為10.
如果內(nèi)部有,那么優(yōu)先查找內(nèi)部的變量,如果沒有再查找外部的變量,作用域鏈逐級(jí)向上查找.


foo中有,那么就用foo的,foo沒有用fun的,fun沒有用全局的a
例1:

先進(jìn)入C函數(shù) 然后進(jìn)入a函數(shù)
進(jìn)入a函數(shù),打印b 此時(shí)由于var的變量提升機(jī)制,b是沒有賦值的,所以為undefined
再打印一次b 值為2
a函數(shù)執(zhí)行完,打印b,由于作用域鏈的機(jī)制外部不能訪問內(nèi)部,b為1
例2:

結(jié)果是111b,注意這個(gè)if里面name變量是用var定義的,由于var的提升機(jī)制,會(huì)把name提升到if之前,也就是進(jìn)入函數(shù)就定義了一個(gè)var name='undefined' 符合if條件后 name賦值為b 根據(jù)字符串隱式轉(zhuǎn)換number類型轉(zhuǎn)化為字符串類型 輸出111b.
此時(shí)關(guān)于var還有一個(gè)優(yōu)先級(jí) 聲明變量>聲明普通函數(shù)>參數(shù)>變量提升

打印10 聲明變量>聲明函數(shù)

打印函數(shù) 聲明函數(shù)>變量提升

打印100 參數(shù)>變量提升

打印函數(shù) 函數(shù)大于變量提升
標(biāo)簽: