亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JS中的提升機制變量提升函數(shù)提升實例詳解

 更新時間:2022年09月26日 11:42:48   作者:十七喜歡前端  
這篇文章主要為大家介紹了JS中的提升機制變量提升函數(shù)提升實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

對一些計算機語言來說,程序被執(zhí)行時,對命令的翻譯通常是自上而下逐行執(zhí)行的,這通常被稱為代碼解釋;

對另外一些語言來說,這種翻譯是預先進行的,被稱為代碼編譯,這樣在程序執(zhí)行的時候,運行的就是已經(jīng)編譯好的、可執(zhí)行的計算機指令。

JavaScript通常被認為是解釋型的,因為每次執(zhí)行js源碼時都需要進行處理。但這么說也不是完全準確的,我們需要知道,JavaScript引擎實際上是動態(tài)編譯程序,然后立即執(zhí)行編譯后的代碼。而JavaScript中的變量聲明和函數(shù)提升的直接原因就是編譯階段編譯器所做的事。

在提升過程中,雖然聲明似乎在程序中被提升了,但實際發(fā)生的事情是,函數(shù)和變量聲明在編譯階段被添加到內(nèi)存中。

一.變量提升

 就變量和常量而言,關鍵字 var 被提升,let 和 const 不允許提升。

a = 5;
console.log(a);
var a; // 5

在上面的示例中,在聲明變量 a 之前使用它。程序運行并顯示輸出 5。該程序的作用如下:

var a;
a = 5;
console.log(a); // 5

然而在 JavaScript 中,初始化不會被提升。

console.log(a);//undefined
var a = 5;

上述程序的作用如下:

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

在編譯階段,只有聲明被移動到內(nèi)存中。因此,變量 a 的值是 undefined,因為 a 是在未初始化的情況下打印的。注意:當變量在函數(shù)內(nèi)部使用時,變量僅被提升到函數(shù)的頂部。

var a = 4;
function greet() {
    b = 'hello';
    console.log(b); 
    var b;
}
greet(); // hello
console.log(b);//Uncaught ReferenceError: b is not defined

如果變量與 let (const)關鍵字一起使用,則不會提升該變量。

a = 5;
console.log(a);// error
let a; 

換一種角度說,變量與let(const)關鍵字一起使用,變量被提升到暫時性死區(qū)(TDZ)中,直到程序執(zhí)行到該變量的let(const)聲明語句的時候才從TDZ中被釋放。

二.函數(shù)提升

由于函數(shù)聲明和變量聲明都會被提升,函數(shù)會先被提升,然后才是變量,并且后面的函數(shù)聲明會覆蓋前面的。

代碼示例:

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

最終結果會輸出1。因為函數(shù)聲明會被提升,而函數(shù)表達式不會被提升。這段代碼可以理解成:

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

三.判斷順序

執(zhí)行函數(shù)中的第一行代碼時,如何判斷該函數(shù)的詞法作用域中存在哪些變量呢?該變量代表的是什么呢?判斷步驟如下:

  • 將參數(shù)列表中的參數(shù)作為變量標識符存儲在作用域中,值為undefined;
  • 將傳入的實參對應給相應的參數(shù)列表中的標識符賦值;
  • 函數(shù)提升;若作用域中有與函數(shù)名同名的標識符,則該函數(shù)取代該標識符的值;
  • var提升;若作用域中有同名的標識符,則不做任何改變,否則在作用域中添加該標識符,且值為undefined;
  • 執(zhí)行第一行代碼。

四.其他“提升” 

1.作為import結果的聲明是“提升的”;

foo();
import { foo } from "foo";

上面這段代碼中,foo()是可以運行的,不只是因為import...語句的靜態(tài)決議在編譯過程中確定了foo值是什么,也因為它“提升”了在模塊作用域頂層的聲明,使它在模塊所用位置可用。

以上就是JS中的提升機制變量提升函數(shù)提升實例詳解的詳細內(nèi)容,更多關于JS 變量提升函數(shù)提升的資料請關注腳本之家其它相關文章!

相關文章

  • javascript數(shù)組的定義及操作實例

    javascript數(shù)組的定義及操作實例

    在文章里小編給大家整理的是關于javascript數(shù)組的定義及操作的相關知識點,需要的朋友們學習下。
    2019-11-11
  • js控制滾動條滾動的兩種簡單方法

    js控制滾動條滾動的兩種簡單方法

    這篇文章主要給大家介紹了關于js控制滾動條滾動的兩種簡單方法,通過JavaScript可以直接控制滾動條的位置,從而達到鎖定滾動條的效果,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • BootStrap表單時間選擇器詳解

    BootStrap表單時間選擇器詳解

    這篇文章主要為大家詳細介紹了BootStrap表單時間選擇器的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 圖解Sublime Text3使用技巧

    圖解Sublime Text3使用技巧

    通過本篇文章給大家介紹Sublime Text3使用技巧的相關知識,對sublime text3技巧相關知識感興趣的朋友一起學習吧
    2015-12-12
  • 基于JavaScript實現(xiàn)圖片放大鏡功能

    基于JavaScript實現(xiàn)圖片放大鏡功能

    在一些電商網(wǎng)站上,經(jīng)??吹接猩唐穲D片被放大查看的功能,所以本文將使用前端技術實現(xiàn)一個簡單的圖片放大鏡功能,希望能給大家?guī)硪欢ǖ膸椭?/div> 2023-06-06
  • JS實現(xiàn)電子時鐘入門操作

    JS實現(xiàn)電子時鐘入門操作

    這篇文章主要為大家詳細介紹了JS實現(xiàn)電子時鐘入門操作,實現(xiàn)帶有表盤的時鐘,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • js如何根據(jù)id刪除數(shù)組中對象

    js如何根據(jù)id刪除數(shù)組中對象

    這篇文章主要介紹了js如何根據(jù)id刪除數(shù)組中對象的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 最新評論