摘要:變量提升什么是變量提升在函數(shù)體內(nèi)聲明的變量,無(wú)論你是在函數(shù)的最底端還是中間聲明的,那么都會(huì)把該變量的聲明提升到函數(shù)的最頂端相當(dāng)于第一行,但是只是提升變量的聲明,不會(huì)賦值。
1、變量提升
什么是變量提升?
在函數(shù)體內(nèi)聲明的變量,無(wú)論你是在函數(shù)的最底端還是中間聲明的,那么都會(huì)把該變量的聲明提升到函數(shù)的最頂端(相當(dāng)于第一行),但是只是提升變量的聲明,不會(huì)賦值。
var num = 10; fun(); //輸出結(jié)果為undefined function fun(){ console.log(num); var num = 20; } /*上面這個(gè)函數(shù)相當(dāng)于: function fun(){ var num; console.log(num); num = 20; } */2、函數(shù)提升
什么是函數(shù)提升?
在JavaScript中以函數(shù)聲明的方式創(chuàng)建的函數(shù)就跟用var創(chuàng)建的變量一樣,它們的聲明都會(huì)提前聲明,這就使得我們?cè)贘avaScript中可以調(diào)用函數(shù)在前面,而聲明函數(shù)在后面,這就是函數(shù)提升。
func(); function func(){ alert(“函數(shù)執(zhí)行了!”); } /* 上面這段代碼相當(dāng)于: function func(){ alert(“函數(shù)執(zhí)行了!”); } func(); */3、函數(shù)與變量同名時(shí)的變量提升
alert(fun); // 最終輸出結(jié)果為:輸出fun函數(shù)體 function fun(){ alert(“我是一個(gè)函數(shù)”); } var fun = “我是一個(gè)變量”; alert(fun); // 輸出:我是一個(gè)變量 /* 為什么第一個(gè)alert輸出的是fun函數(shù)體,而第二個(gè)alert輸出的是“我是一個(gè)變量”? 因?yàn)橛胿ar聲明的變量及function聲明的函數(shù)在執(zhí)行前都會(huì)將聲明提升到最前面,如果變量與函數(shù)同名, 那么在聲明的時(shí)候會(huì)忽略變量,只提升函數(shù)聲明! */ /* 上面這段代碼相當(dāng)于: function fun(){ alert(“我是一個(gè)函數(shù)”); } alert(fun); fun = “我是一個(gè)變量”; alert(fun); */4、變量搜索原則(變量訪問(wèn)原則)
在JavaScript中變量的訪問(wèn)(搜索)是有原則的:
1)、首先在訪問(wèn)變量的作用域(函數(shù))中查找該變量,如果找到直接使用 2)、如果沒(méi)有找到,去上一級(jí)作用域中查找,如果找到直接使用 3)、如果還是沒(méi)有找到,則再去上一級(jí)作用域中查找,知道全局作用域 4)、如果找到了就直接使用,如果沒(méi)有找到則報(bào)錯(cuò)
var num = 123; function foo1(){ function foo2(){ console.log(num); } /*當(dāng)調(diào)用foo2時(shí),會(huì)首先去foo2這個(gè)作用域中查找是否有num變量,結(jié)果沒(méi)找到則去上一級(jí)作用域(即foo1)中查找是否有foo1變量, 結(jié)果還 是沒(méi)找到,則再去上一級(jí)作用域(全局作用域)中查找,結(jié)果找到了,則拿來(lái)使用*/ foo2(); }5、變量提升、變量搜索機(jī)制經(jīng)典面試題
fun(); console.log(b); console.log(c); console.log(a); functoin fun(){ var a = b = c = 9; console.log(a); console.log(b); console.log(c); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/100695.html
摘要:編譯原理在傳統(tǒng)編譯語(yǔ)言的流程中,程序中的一段源代碼在執(zhí)行之前會(huì)經(jīng)歷三個(gè)步驟,統(tǒng)稱(chēng)為編譯。定義聲明是在編譯階段進(jìn)行的,而賦值是在執(zhí)行階段進(jìn)行的。 編譯原理 在傳統(tǒng)編譯語(yǔ)言的流程中,程序中的一段源代碼在執(zhí)行之前會(huì)經(jīng)歷三個(gè)步驟,統(tǒng)稱(chēng)為編譯。 詞法分析將由字符組成的字符串分解成(對(duì)編程語(yǔ)言來(lái)說(shuō))有意義的代碼塊,這些代碼塊被稱(chēng)為詞法單元(token)。 語(yǔ)法分析這個(gè)過(guò)程是將詞法單元流(數(shù)組)轉(zhuǎn)...
摘要:關(guān)于本書(shū),我會(huì)寫(xiě)好幾篇讀書(shū)筆記用以記錄那些讓我恍然大悟的瞬間,本文是第一篇弄懂的作用域和閉包。作用域也可以看做是一套依據(jù)名稱(chēng)查找變量的規(guī)則。聲明實(shí)際上是根據(jù)你傳遞給它的對(duì)象憑空創(chuàng)建了一個(gè)全新的詞法作用域。 《你不知道的JavaScript》真的是一本好書(shū),閱讀這本書(shū),我有多次哦,原來(lái)是這樣的感覺(jué),以前自以為理解了(其實(shí)并非真的理解)的概念,這一次真的理解得更加透徹了。關(guān)于本書(shū),我會(huì)寫(xiě)好...
摘要:不同的是函數(shù)體并不會(huì)再被提升至函數(shù)作用域頭部,而僅會(huì)被提升到塊級(jí)作用域頭部避免全局變量在計(jì)算機(jī)編程中,全局變量指的是在所有作用域中都能訪問(wèn)的變量。 ES6 變量作用域與提升:變量的生命周期詳解從屬于筆者的現(xiàn)代 JavaScript 開(kāi)發(fā):語(yǔ)法基礎(chǔ)與實(shí)踐技巧系列文章。本文詳細(xì)討論了 JavaScript 中作用域、執(zhí)行上下文、不同作用域下變量提升與函數(shù)提升的表現(xiàn)、頂層對(duì)象以及如何避免創(chuàng)建...
摘要:作用域分類(lèi)作用域共有兩種主要的工作模型。換句話說(shuō),作用域鏈?zhǔn)腔谡{(diào)用棧的,而不是代碼中的作用域嵌套。詞法作用域詞法作用域中,又可分為全局作用域,函數(shù)作用域和塊級(jí)作用域。 一篇鞏固基礎(chǔ)的文章,也可能是一系列的文章,梳理知識(shí)的遺漏點(diǎn),同時(shí)也探究很多理所當(dāng)然的事情背后的原理。 為什么探究基礎(chǔ)?因?yàn)槟悴蝗ッ嬖嚹憔筒恢阑A(chǔ)有多重要,或者是說(shuō)當(dāng)你的工作經(jīng)歷沒(méi)有亮點(diǎn)的時(shí)候,基礎(chǔ)就是檢驗(yàn)?zāi)愫脡牡囊豁?xiàng)...
摘要:也毫不例外,但在中作用域的特性與其他高級(jí)語(yǔ)言稍有不同,這是很多學(xué)習(xí)者久久難以理清的一個(gè)核心知識(shí)點(diǎn)。主要使用的是函數(shù)作用域。 關(guān)于作用域:About Scope 作用域是程序設(shè)計(jì)里的基礎(chǔ)特性,是作用域使得程序運(yùn)行時(shí)可以使用變量存儲(chǔ)值、記錄和改變程序的狀態(tài)。JavaScript 也毫不例外,但在 JavaScript 中作用域的特性與其他高級(jí)語(yǔ)言稍有不同,這是很多學(xué)習(xí)者久久難以理清的一個(gè)核...
閱讀 1100·2021-10-12 10:11
閱讀 884·2019-08-30 15:53
閱讀 2296·2019-08-30 14:15
閱讀 2970·2019-08-30 14:09
閱讀 1206·2019-08-29 17:24
閱讀 980·2019-08-26 18:27
閱讀 1287·2019-08-26 11:57
閱讀 2157·2019-08-23 18:23