6 回答

TA貢獻1875條經(jīng)驗 獲得超5個贊
舉個直白的例子
function Example(){
var a = 1 //此時為局部變量
}
(function(){
b=1
})()
為什么會掛載全局(window) 是因為上面這個代碼b其實是賦值 默認全局應該會有var b;這個聲明語句

TA貢獻1779條經(jīng)驗 獲得超6個贊
沒太看懂題主想問啥,只能說如果b
之前沒有聲明過,那這種寫法在非嚴格模式下會導致jvm
幫你聲明b
,然后再賦值;在嚴格模式下會直接報錯,畢竟沒有聲明。如果之前b
在外層或本層作用域有聲明過,那這里只是修改了原先b
的值。
建議查查看“嚴格模式”。
另外好像有聽說過jvm
在執(zhí)行一段腳本時會先把里面的變量先聲明好,再執(zhí)行。這段話是我憑印象說的,僅供參考。
b
輸出當然會報錯,因為你在輸出的時候還沒有聲明b
,除非你console.log(b = 1)
,這時才會先幫你聲明b
,再輸出。就算jvm
會幫你看一遍代碼,發(fā)現(xiàn)你底下聲明了b
,但因此就幫你提前聲明b
是不符合程序規(guī)范的,沒有哪個正常的、生產(chǎn)環(huán)境下的程序會先使用后聲明。

TA貢獻1827條經(jīng)驗 獲得超9個贊
a能被打印是因為變量提升的原因,b沒有聲明所以會所以會向上一層層找變量名為b的值,由于先前也沒有聲明過,棧中找不到,所以會報錯。
當代碼執(zhí)行到b的時候,沒寫var,會向上一層一層找是否有定義,如果有則將表達式賦值,如果找到最上層沒有對應的變量,則將b作為windows的對象的屬性并賦值。
第二個問題的話我不是太能理解。不知道你說的是不是這個意思:
一個作為全局變量的obj,在聲明之前打印,發(fā)現(xiàn)時undefined,
然后聲明并賦值,在打印輸出{},最后輸出的underlined是var obj = new Object()的返回值。
由于變量提升的原因,雖然代碼第一行沒定義obj,但實際上運行的時候是拆成了這樣
var obj = undefined//全局變量聲明
console.log(obj)//undefined
obj = new Object()//變量賦值
console.log(obj)//{}
至于b么,在代碼中沒有對他進行任何聲明,當然也不會提升,只是運行到這里的時候會當做b已經(jīng)在之前的部分已經(jīng)生命過一樣,向上查找,當找到最上層,也就是window對象后,嗯,掛上去XD

TA貢獻1860條經(jīng)驗 獲得超8個贊
這樣看,a聲明了,但沒有定義
var a;
console.log(a); // undefined
console.log(b); // b 沒有聲明
b = 10;
a = 20;
b沒有定義,直接是掛載在window下面的

TA貢獻1844條經(jīng)驗 獲得超8個贊
添加回答
舉報