JS變量提升和函數(shù)提升
點擊上方藍色字體,選擇“標星公眾號”
優(yōu)質(zhì)文章,第一時間送達
? 作者?|??newObject()=>error
來源 |? urlify.cn/F7jQRn
1.變量提升
在ES6之前,我們聲明一個變量需要用到var關(guān)鍵字,用var來聲明的變量就存在變量提升的特性。

上述代碼粗略來講解,在上述代碼中存在全局作用域和函數(shù)作用域,在兩個作用域中都聲明了變量a。在fn函數(shù)執(zhí)行console.log(a)的時候,先會在自身所處在的函數(shù)作用域中找到變量a,
如果沒有找到,就會去全局作用域中找。
在fn函數(shù)作用域中我們可以看到a變量聲明并賦值了,但是它處于console.log(a)語句的下方,按照正常的邏輯,它不應(yīng)該找到的是外層定義的a嗎?但是結(jié)果恰恰相反。
代碼執(zhí)行流程:
我們可以根據(jù)位置來把代碼分為全局代碼和函數(shù)(局部)代碼。在執(zhí)行全局代碼前,首先將window添加為全局執(zhí)行上下文,之后對全局數(shù)據(jù)做預(yù)處理工作:
?。?)找到var關(guān)鍵聲明的變量,賦值為undefined,且添加為window的屬性。=>變量提升
?。?)將function聲明的變量賦值fun(),添加為window屬性。=>函數(shù)提升
(3)this =>賦值window
在預(yù)處理結(jié)束后,開始執(zhí)行全局代碼。
函數(shù)代碼執(zhí)行流程也和上述大同小異,這里涉及到執(zhí)行上下文,就不細講了,后續(xù)會補充。
所以我們可以這樣理解這行代碼

? 最后的結(jié)果自然就是undefined。這就是js存在的變量提升。?
2.函數(shù)提升
函數(shù)提升和變量提升的原理一樣,區(qū)別就是在于,函數(shù)提升已經(jīng)創(chuàng)建好了函數(shù)對象,而變量提升賦值為undefined,可以理解為變量聲明提升。
?

3.拓展
(1)var fn = function(){}和function fn(){}的區(qū)別:前者為變量提升,后者為函數(shù)提升。


?
? 如果是用變量提升來聲明函數(shù),如果在此前調(diào)用該函數(shù),此時的函數(shù)對象并沒有創(chuàng)建,變量fn2賦值為undefined,所以瀏覽器不能識別,把它當做函數(shù)來調(diào)用,所以最后報錯。
(2)在js中,函數(shù)是第一公民
被覆蓋的不是函數(shù)fn,而是var fn =3;

結(jié)果:



??? ?
感謝點贊支持下哈?
