翻翻過去那場雪
2019-09-20 17:22:02
我遇到了JavaScript'hoisting',我沒有弄清楚這段代碼是如何起作用的:var a = 1;function b() { a = 10; return; function a() {}}b();alert(a);我知道像(function a() {})這樣的函數(shù)聲明將被提升到函數(shù)b作用域的頂部,但是它不應(yīng)該覆蓋a(因?yàn)楹瘮?shù)聲明覆蓋變量聲明而不是變量初始化)的值,所以我期望警報(bào)的值會是10而不是1 !!
3 回答

回首憶惘然
TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊
全局
a
設(shè)定為1
b()
叫做function a() {}
被懸掛并創(chuàng)建一個(gè)掩蓋全局變量的局部變量a
a
本地
a
設(shè)置為10
(覆蓋函數(shù)a
)全局
a
(靜止1
)被警告

躍然一笑
TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊
這是因?yàn)檫@個(gè)例子中的編譯/解釋順序有些誤導(dǎo)。function a () {}
在執(zhí)行任何其余函數(shù)之前解釋該行,因此在函數(shù)的最開始,a
其值為function a () {}
。當(dāng)您重新分配它時(shí)10
,您將重新分配a
函數(shù)的本地作用域中的值b()
,然后在返回后將其丟棄,并將原始值保留a = 1
在全局作用域中。
您可以通過alert()
在適當(dāng)?shù)奈恢梅胖胹等來驗(yàn)證這一點(diǎn),以查看a
各個(gè)點(diǎn)的值。
添加回答
舉報(bào)
0/150
提交
取消