最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

正文

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

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

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

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

一.變量提升

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

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

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

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

然而在 JavaScript 中,初始化不會(huì)被提升。

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

上述程序的作用如下:

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

在編譯階段,只有聲明被移動(dòng)到內(nèi)存中。因此,變量 a 的值是 undefined,因?yàn)?a 是在未初始化的情況下打印的。注意:當(dāng)變量在函數(shù)內(nèi)部使用時(shí),變量?jī)H被提升到函數(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)關(guān)鍵字一起使用,則不會(huì)提升該變量。

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

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

二.函數(shù)提升

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

代碼示例:

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

最終結(jié)果會(huì)輸出1。因?yàn)楹瘮?shù)聲明會(huì)被提升,而函數(shù)表達(dá)式不會(huì)被提升。這段代碼可以理解成:

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

三.判斷順序

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

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

四.其他“提升” 

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

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

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

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

相關(guān)文章

  • JS 判斷某變量是否為某數(shù)組中的一個(gè)值的3種方法(總結(jié))

    JS 判斷某變量是否為某數(shù)組中的一個(gè)值的3種方法(總結(jié))

    下面小編就為大家?guī)硪黄狫S 判斷某變量是否為某數(shù)組中的一個(gè)值的3種方法(總結(jié))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • 微信小程序App生命周期詳解

    微信小程序App生命周期詳解

    這篇文章主要為大家詳細(xì)介紹了微信小程序App生命周期的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • JS設(shè)計(jì)模式之?dāng)?shù)據(jù)訪問對(duì)象模式的實(shí)例講解

    JS設(shè)計(jì)模式之?dāng)?shù)據(jù)訪問對(duì)象模式的實(shí)例講解

    下面小編就為大家?guī)硪黄狫S設(shè)計(jì)模式之?dāng)?shù)據(jù)訪問對(duì)象模式的實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • JavaScript中 this 指向問題深度解析

    JavaScript中 this 指向問題深度解析

    這篇文章主要介紹了JavaScript中 this 指向問題深度解析,JavaScript 中的 this 指向問題有很多文章在解釋,仍然有很多人問,本文給大家深度解析,需要的朋友可以參考下
    2017-02-02
  • JavaScript中的立即執(zhí)行函數(shù)表達(dá)式介紹

    JavaScript中的立即執(zhí)行函數(shù)表達(dá)式介紹

    這篇文章主要介紹了JavaScript中的立即執(zhí)行函數(shù)表達(dá)式介紹,本文著重講解了什么是立即調(diào)用函數(shù)表達(dá)式,需要的朋友可以參考下
    2015-03-03
  • js實(shí)現(xiàn)前端圖片上傳即時(shí)預(yù)覽功能

    js實(shí)現(xiàn)前端圖片上傳即時(shí)預(yù)覽功能

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)前端圖片即時(shí)預(yù)覽功能,本地預(yù)覽功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 最新評(píng)論

    青铜峡市| 玉环县| 永修县| 昌图县| 聊城市| 海口市| 桂阳县| 青铜峡市| 镇原县| 沁源县| 河东区| 石林| 包头市| 安阳市| 富锦市| 阿拉尔市| 阜新| 衡南县| 乌鲁木齐市| 思茅市| 雷波县| 建德市| 尉犁县| 会东县| 巴彦县| 科技| 曲松县| 临海市| 衡阳市| 来凤县| 潢川县| 武宣县| 合江县| 沐川县| 三穗县| 灵寿县| 周宁县| 嘉定区| 搜索| 日照市| 上林县|