av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術文章
文章詳情頁

淺談JavaScript 聲明提升

瀏覽:78日期:2023-10-13 17:34:05

1 引例及基本原理

在學習JavaScript聲明提升之前,我們先看下面這個例子:

console.log(a);var a=2;

運行結果會是什么?你可能會有以下的猜測:

1.報錯ReferenceError: a is not defined;

2.打印2;

3.打印undefined。

正確的結果是第三種,打印undefined。

下面讓我們來看看具體的原因。其實,對于var a=2;這條語句,JavaScript會將其視為兩個聲明:

定義聲明var a,會在編譯階段進行; 賦值聲明a=2,會留在原地等待執行階段進行。

而所謂的聲明提升:就是JavaScript會把var變量聲明和函數聲明都會被提升到各自作用域的頂部,而賦值操作并不會被提升。因此,上面的例子實際是按照這樣的流程來處理:

var a;console.log(a);a=2;

我們還需要知道,不僅僅是var變量聲明會提升,函數聲明同樣也會提升,現在來看下面這個例子

foo();function foo(){ console.log(a); var a=2;}

這個例子的運行結果為:打印undefined。這段代碼實際上會被理解為為下面的形式:

function foo(){ var a; console.log(a); a=2;}foo();

2 關于聲明提升的常見問題

2.1 函數表達式

先看一個函數表達式的例子:

console.log(foo);var foo=function(){}

上面代碼的運行結果為:打印undefined。實際上,變量標識符foo被提升了,但它的賦值操作并沒有被提升,我們可以理解為下面的形式:

var foo;console.log(foo);foo=function(){}

結論:函數聲明會被提升,但函數表達式不會被提升。

2.2 聲明的優先級

如果在同一個作用域內,存在同名的函數聲明和var變量聲明,那么會發生什么樣的情況呢?我們同樣再來看一個例子:

function a(){}var a;console.log(a);

var a;function a(){}console.log(a);

上面的兩種寫法,運行結果均為打印a(){}。也就是說,如果在同一個作用域內,存在同名的函數聲明和var變量聲明,則函數聲明的優先級更高。還有一種情況:如果同一個作用域內,存在多個同名的函數聲明。這種情況下,后面聲明的會覆蓋前面聲明的。

3 練習題

3.1 第一題

var getName = function() { console.log(1);}function getName() { console.log(2);}getName();

答案:打印1

解析:提升后的順序如下

var getName;//與函數聲明同名,故失效function getName() { console.log(2);}getName = function() {//賦值 console.log(1);};getName();

3.2 第二題

var a = 1;function b(){ a = 10; return; function a(){ console.log(a); } }b();console.log(a);

答案:打印1

解析:首先,我們需要梳理清楚聲明的提升。本題有幾個關鍵點,我們需要明白:

函數b內的a函數雖然在return之后,但它并沒有失效,它會發生聲明提升,從而提升到b函數作用域的頂部。

很多童鞋(比如我TAT)可能會錯誤地認為這題的答案是10,認為我們在最后調用了b函數,修改了全局變量a。實際上,由于函數a發生了聲明提升,導致在函數b內“遮蔽”了全局作用域中的變量a,因此,a=10;其實是將函數a重新賦值。為了進一步測驗,大家可以把a函數注釋掉,會發現此時的答案就變成了10。

注:本題還涉及到了閉包的相關知識,這一題詳細的解析請見參考資料[2],講得非常詳細。

var a;//全局變量a發生了聲明提升function b(){ function a(){//函數a發生聲明提升 console.log(a); } a = 10;//因為函數a離它最近,因此賦值給函數a return; }a = 1;//賦值給了全局變量ab();console.log(a);

4 參考資料

[1] 《你不知道的JavaScript》

[2] js中變量名與函數名重名的問題,Charles_Tian

[3] 函數聲明與變量聲明的提升機制優先級問題,一個菜鳥的奮斗史

以上就是淺談JavaScript 聲明提升的詳細內容,更多關于JavaScript 聲明提升的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 成人福利视频网站 | 精品伊人久久 | 天堂av中文 | 欧美日韩电影免费观看 | 国产成人综合一区二区三区 | 亚洲色图综合网 | 国产精品久久久久久久久久了 | 欧美成人免费在线视频 | 国产亚洲精品久久久久久牛牛 | 日本黄视频在线观看 | 9999久久| 懂色一区二区三区免费观看 | 亚洲成av人影片在线观看 | 美女啪啪国产 | 欧美精品一区在线发布 | 亚洲高清视频一区二区 | 综合久久综合久久 | 国产一区二区电影 | 午夜精品一区二区三区三上悠亚 | 2020天天操| 日本精品一区 | 国产97色 | 国产精品久久久久久婷婷天堂 | 北条麻妃一区二区三区在线观看 | 国产精品久久久久久av公交车 | 久久精品亚洲一区 | 欧美日韩专区 | 久99久视频| 欧美国产精品一区二区三区 | 亚洲国产精品久久 | 超碰在线观看97 | 激情欧美一区二区三区中文字幕 | 99久久久国产精品 | 欧美二区三区 | 免费看一级毛片 | 精品久久久久久久久久久久久久久久久 | 欧美www在线观看 | 欧产日产国产精品视频 | 91 视频网站| 国产亚洲高清视频 | 国户精品久久久久久久久久久不卡 |