JS的變量和函數(shù)提升

1.js的運(yùn)行和預(yù)編譯過程

<1>.語法分析

查找基本語法有無錯誤;

<2>、預(yù)解析/預(yù)編譯

執(zhí)行之前進(jìn)行預(yù)解析;

var,function關(guān)鍵字提前到當(dāng)前作用域頂部,即變量提升或函數(shù)提升,變量默認(rèn)值為undefined,函數(shù)默認(rèn)值為函數(shù)體代碼塊,當(dāng)函數(shù)與變量重名時,保留函數(shù)。

<3>、解釋執(zhí)行

2.例題

1)、變量可以在使用后聲明,也就是變量可以先使用后聲明

x =?5;?// 變量 x 設(shè)置為 5

elem = document.getElementById("demo");?// 查找元素?

elem.innerHTML = x;?// 在元素中顯示 x

var?x;?// 聲明 x

變量 提升之后

var?x;?// 聲明 x

x =?5;?// 變量 x 設(shè)置為 5

elem = document.getElementById("demo");?// 查找元素?

elem.innerHTML = x;??

2)只有聲明的變量會提升,而初始化的不會

例1.var?x =?5;?// 初始化 x

var?y =?7;?// 初始化 y

elem = document.getElementById("demo");?// 查找元素?

elem.innerHTML = x +?" "?+ y;// 顯示 x 和 y

對比

例2、var?x =?5;?// 初始化 x

elem = document.getElementById("demo");?// 查找元素?

elem.innerHTML = x +?" "?+ y;// 顯示 x 和 y

var?y =?7;?// 初始化 y

此例中y的輸出值為undefined,這是因為變量聲名(var y)提升了,但是y=7沒有提升,所以y變量是一個沒有定義的變量。

變量提升之后

var x = 5; // 初始化 x

var y; // 聲明 y

elem = document.getElementById("demo"); // 查找元素

elem.innerHTML = x + " " + y; // 顯示 x 和 yy = 7; // 設(shè)置 y 為 7

3)、其他一些例題

//預(yù)編譯

/* console.log(a);

var a = 10; //變量提升

console.log(a); */

/* 提升之后的結(jié)果

var a;

console.log(a);

a = 10; */

4)、局部作用域中的變量提升

/* var b = 10;

function foo(){

console.log(b);

var b = 20;

}

foo(); */

/*// 提升之后的結(jié)果

var b = 10;

function foo(){

var b;

console.log(b);

b = 20;

}

foo();

*/



函數(shù)提升

例題

//函數(shù)提升(包括函數(shù)體一塊提升)

/* bar();

function bar(){

alert(123);

} */

//通過function關(guān)鍵字申明的函數(shù)會連著函數(shù)體一塊提升到當(dāng)前作用域頂部

//但是通過變量名賦值為一個匿名函數(shù)的方式申明的函數(shù),只會提升變量的申明,函數(shù)體不會提升

/* bar();

var bar = function(){

alert(456);

} */

/* 提升之后的,會報錯

var bar;

bar();

bar = function(){

alert(456);

} */

注意:1.局部變量只作用于函數(shù)內(nèi)部,所以不同的函數(shù)可以使用相同名稱的變量

2、局部變量在函數(shù)開始時創(chuàng)建,在函數(shù)執(zhí)行完成之后銷毀。(局部變量出棧即銷毀)

3、如果變量在函數(shù)內(nèi)沒有var即沒有聲明,該變量為全局變量。



例題
/* alert(a);

var a = 1;

alert(a);

function a(){alert(2);}

alert(a);

var a = 3;

alert(a);

function a(){alert(3);}

alert(a);*/

預(yù)編譯之后

/* function a(){alert(3);}

alert(a); //function a(){alert(3);}

a = 1;

alert(a); //1

alert(a); //1

a = 3;

alert(a); //3

alert(a); //3 */

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容