JavaScript的變量聲明提升問題淺析(Hoisting)
一、變量聲明提升
hoisting 英[‘hɔɪstɪŋ] 美[‘hɔɪstɪŋ]
n. 起重,提升
v. 把…吊起,升起( hoist的現(xiàn)在分詞 )
先來看一個栗子
var cc = 'hello';
function foo(){
console.log(cc);
var cc = 'world';
console.log(cc);
}
foo();
console.log(cc);
這里將會輸出 undefined、'world' 、'hello'
此處主要有兩個知識點(diǎn):
1、作用域
2、變量聲明提升
JavaScript是一門解釋性語言,當(dāng)代碼在解釋器(如Chrome的V8引擎)環(huán)境中執(zhí)行時,會有一個預(yù)解析的過程,此時會將變量聲明和函數(shù)聲明提升至當(dāng)前作用域的最前方,這個行為被稱為聲明提升(Hoisting)
再來看上面的例子,此代碼有兩層作用域,全局作用域和函數(shù)foo作用域,而foo中的變量聲明在預(yù)解析的過程中會被提升至函數(shù)作用域的前方,于是代碼就會變成這樣:
var cc = 'hello';
function foo(){
var cc;
console.log(cc);
cc = 'world';
console.log(cc);
}
foo();
console.log(cc);
當(dāng)執(zhí)行到第一個log時,變量cc只是進(jìn)行了聲明,并未賦值,所以打印出的是undefined
二、 函數(shù)聲明提升
函數(shù)的聲明有兩種方式:函數(shù)聲明和函數(shù)表達(dá)式
// 函數(shù)聲明
function foo(a, b) {
return a + b;
}
// 函數(shù)表達(dá)式
var foo = function(a, b) {
return a + b;
}
解析器在向執(zhí)行環(huán)境中加載數(shù)據(jù)時,對函數(shù)聲明和函數(shù)表達(dá)式并非一視同仁。解析器會率先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼之前可用(可以訪問);至于函數(shù)表達(dá)式,則必須等到解析器執(zhí)行到它所在的代碼行,才會真正被解釋執(zhí)行。
當(dāng)然,也可以函數(shù)聲明和函數(shù)表達(dá)式同時使用,如var a = function b(){} ,其結(jié)果是只具有函數(shù)表達(dá)式的作用,b會被自動忽略,所以只會發(fā)生變量提升效果。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
微信小程序?qū)崿F(xiàn)分類菜單激活狀態(tài)隨列表滾動而自動切換效果詳解
這篇文章主要介紹了微信小程序分類菜單激活狀態(tài)跟隨列表滾動自動切換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
JavaScript中數(shù)組flat方法的使用與實(shí)現(xiàn)方法
在Array的顯示原型下有一個flat方法,可以將多維數(shù)組,降維,傳的參數(shù)是多少就降多少維,下面這篇文章主要給大家介紹了關(guān)于JavaScript中數(shù)組flat方法的使用與實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2022-08-08

