欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談JavaScript 聲明提升

 更新時(shí)間:2020年09月14日 09:25:48   作者:笨笨橙  
這篇文章主要介紹了JavaScript 聲明提升的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)JavaScript,感興趣的朋友可以了解下

1 引例及基本原理

在學(xué)習(xí)JavaScript聲明提升之前,我們先看下面這個(gè)例子:

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

運(yùn)行結(jié)果會(huì)是什么?你可能會(huì)有以下的猜測(cè):

1.報(bào)錯(cuò)ReferenceError: a is not defined;

2.打印2;

3.打印undefined。

正確的結(jié)果是第三種,打印undefined。

下面讓我們來(lái)看看具體的原因。其實(shí),對(duì)于var a=2;這條語(yǔ)句,JavaScript會(huì)將其視為兩個(gè)聲明:

  1. 定義聲明var a,會(huì)在編譯階段進(jìn)行;
  2. 賦值聲明a=2,會(huì)留在原地等待執(zhí)行階段進(jìn)行。

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

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

我們還需要知道,不僅僅是var變量聲明會(huì)提升,函數(shù)聲明同樣也會(huì)提升,現(xiàn)在來(lái)看下面這個(gè)例子

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

這個(gè)例子的運(yùn)行結(jié)果為:打印undefined。這段代碼實(shí)際上會(huì)被理解為為下面的形式:

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

2 關(guān)于聲明提升的常見(jiàn)問(wèn)題

2.1 函數(shù)表達(dá)式

先看一個(gè)函數(shù)表達(dá)式的例子:

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

上面代碼的運(yùn)行結(jié)果為:打印undefined。實(shí)際上,變量標(biāo)識(shí)符foo被提升了,但它的賦值操作并沒(méi)有被提升,我們可以理解為下面的形式:

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

結(jié)論:函數(shù)聲明會(huì)被提升,但函數(shù)表達(dá)式不會(huì)被提升。

2.2 聲明的優(yōu)先級(jí)

如果在同一個(gè)作用域內(nèi),存在同名的函數(shù)聲明和var變量聲明,那么會(huì)發(fā)生什么樣的情況呢?我們同樣再來(lái)看一個(gè)例子:

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

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

3 練習(xí)題

3.1 第一題

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

答案:打印1

解析:提升后的順序如下

var getName;//與函數(shù)聲明同名,故失效
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

解析:首先,我們需要梳理清楚聲明的提升。
本題有幾個(gè)關(guān)鍵點(diǎn),我們需要明白:

函數(shù)b內(nèi)的a函數(shù)雖然在return之后,但它并沒(méi)有失效,它會(huì)發(fā)生聲明提升,從而提升到b函數(shù)作用域的頂部。

很多童鞋(比如我TAT)可能會(huì)錯(cuò)誤地認(rèn)為這題的答案是10,認(rèn)為我們?cè)谧詈笳{(diào)用了b函數(shù),修改了全局變量a。實(shí)際上,由于函數(shù)a發(fā)生了聲明提升,導(dǎo)致在函數(shù)b內(nèi)“遮蔽”了全局作用域中的變量a,因此,a=10;其實(shí)是將函數(shù)a重新賦值。為了進(jìn)一步測(cè)驗(yàn),大家可以把a(bǔ)函數(shù)注釋掉,會(huì)發(fā)現(xiàn)此時(shí)的答案就變成了10。

注:本題還涉及到了閉包的相關(guān)知識(shí),這一題詳細(xì)的解析請(qǐng)見(jiàn)參考資料[2],講得非常詳細(xì)。

var a;//全局變量a發(fā)生了聲明提升
function b(){
 function a(){//函數(shù)a發(fā)生聲明提升
   console.log(a);
  }
 a = 10;//因?yàn)楹瘮?shù)a離它最近,因此賦值給函數(shù)a
 return; 
}
a = 1;//賦值給了全局變量a
b();
console.log(a); 

4 參考資料

[1] 《你不知道的JavaScript

[2] js中變量名與函數(shù)名重名的問(wèn)題,Charles_Tian

[3] 函數(shù)聲明與變量聲明的提升機(jī)制優(yōu)先級(jí)問(wèn)題,一個(gè)菜鳥(niǎo)的奮斗史

以上就是淺談JavaScript 聲明提升的詳細(xì)內(nèi)容,更多關(guān)于JavaScript 聲明提升的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • ES6 javascript的異步操作實(shí)例詳解

    ES6 javascript的異步操作實(shí)例詳解

    這篇文章主要介紹了ES6 javascript的異步操作,結(jié)合實(shí)例形式分析了ES5中異步操作的概念、原理、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-10-10
  • JavaScript腳本庫(kù)編寫的方法

    JavaScript腳本庫(kù)編寫的方法

    本文給大家分享javascript腳本庫(kù)編寫的方法,涉及到j(luò)avascript腳本相關(guān)知識(shí),對(duì)javascript腳本相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • JavaScript中數(shù)據(jù)結(jié)構(gòu)與算法(一):棧

    JavaScript中數(shù)據(jù)結(jié)構(gòu)與算法(一):棧

    這篇文章主要介紹了JavaScript中數(shù)據(jù)結(jié)構(gòu)與算法(一):棧,本文講解了棧的結(jié)構(gòu)、什么是回文以及遞歸等內(nèi)容,講解的不錯(cuò),通俗易懂,需要的朋友可以參考下
    2015-06-06
  • JavaScript實(shí)現(xiàn)輪播圖方法(邏輯清晰一看就懂)

    JavaScript實(shí)現(xiàn)輪播圖方法(邏輯清晰一看就懂)

    這篇文章主要給大家介紹了關(guān)于JavaScript實(shí)現(xiàn)輪播圖方法的相關(guān)資料,JS輪播圖的實(shí)現(xiàn)核心是使用JavaScript來(lái)控制圖片的切換和顯示,配合HTML和CSS完成布局和樣式設(shè)置,文中介紹的方法邏輯清晰一看就懂,需要的朋友可以參考下
    2023-12-12
  • JS獲取當(dāng)前時(shí)間的實(shí)例代碼(昨天、今天、明天)

    JS獲取當(dāng)前時(shí)間的實(shí)例代碼(昨天、今天、明天)

    這篇文章主要介紹了JS獲取當(dāng)前時(shí)間的實(shí)例代碼(昨天、今天、明天) ,需要的朋友可以參考下
    2018-11-11
  • 詳解javascript中的事件處理

    詳解javascript中的事件處理

    這篇文章主要介紹了javascript的事件處理,需要的朋友可以參考下
    2015-11-11
  • JS讀取cookies信息(記錄用戶名)

    JS讀取cookies信息(記錄用戶名)

    很多網(wǎng)站、博客把網(wǎng)頁(yè)生成html靜態(tài)頁(yè)面了,以利于搜索引擎的索引排名,減輕服務(wù)器負(fù)擔(dān)。靜態(tài)頁(yè)面由于其穩(wěn)定快速更快,給用戶及站長(zhǎng)帶來(lái)了方便。但評(píng)論后如何記住用戶的信息呢
    2012-01-01
  • JSON與JavaScript對(duì)象關(guān)系及語(yǔ)法規(guī)則詳解

    JSON與JavaScript對(duì)象關(guān)系及語(yǔ)法規(guī)則詳解

    這篇文章主要為大家介紹了JSON與JavaScript對(duì)象關(guān)系及語(yǔ)法規(guī)則詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • JavaScript移除數(shù)組內(nèi)重復(fù)元素的方法

    JavaScript移除數(shù)組內(nèi)重復(fù)元素的方法

    這篇文章主要介紹了JavaScript移除數(shù)組內(nèi)重復(fù)元素的方法,實(shí)例分析了javascript遍歷數(shù)組及刪除等操作的相關(guān)技巧,需要的朋友可以參考下
    2015-03-03
  • 深入淺出理解javaScript原型鏈

    深入淺出理解javaScript原型鏈

    這篇文章主要介紹了對(duì)javaScript原型鏈的理解,以實(shí)例形式對(duì)javaScript原型鏈的概念及相關(guān)使用技巧做了較為淺顯易懂的分析,需要的朋友可以參考下
    2015-05-05

最新評(píng)論