2 回答

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊
這樣是全局的:
var tt = 'aa';function test() { alert(tt); }test();
這是你的例子:
var tt = 'aa';function test() { alert(tt); var tt = 'dd'; alert(tt); } test();
在函數(shù)內(nèi)部使用var聲明變量,是局部的。優(yōu)先級(jí)高于函數(shù)外部的全局變量。
這個(gè)說(shuō)明js解釋器的解析順序,盡管你的alert(tt)
在var tt = 'dd'
前面,但是它還是認(rèn)為你是在內(nèi)部定義了一個(gè)局部變量。
function test() { var tt; alert(tt); tt = 'dd'; alert(tt); }

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊
這題總結(jié)下來(lái)就2點(diǎn)知識(shí):
1. 聲明提升
2. 作用域鏈
先說(shuō)后者,js在訪問(wèn)一個(gè)變量時(shí)會(huì)優(yōu)先在該作用域(訪問(wèn)時(shí)的那個(gè)作用域)內(nèi)尋找是否聲明過(guò)該變量,如果該變量已經(jīng)存在,則直接使用它的值,否則它會(huì)尋找該作用域的‘父作用域/上級(jí)作用域’,以此類推,直到找到全局作用域?yàn)橹埂?/p>
關(guān)于聲明提升是指:js在解析的時(shí)候總是會(huì)將var
, function
這類關(guān)鍵詞的聲明語(yǔ)句提升至該作用域的最頂部(注意:這里只會(huì)提升聲明部分)。
于是你那段代碼等價(jià)于下面
var tt = 'aa'; function test(){ var tt; //這個(gè)tt未被賦值,按js的‘規(guī)矩’,它的值是`undefined` alert(tt); tt = 'dd'; alert(tt); } test();
所以執(zhí)行的時(shí)候返回的是 undefined
和 dd
.
添加回答
舉報(bào)