中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

JavaScript提升機制Hoisting的示例分析-創新互聯

這篇文章主要為大家展示了“JavaScript提升機制Hoisting的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“JavaScript提升機制Hoisting的示例分析”這篇文章吧。

10余年的鎮坪網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。成都全網營銷推廣的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整鎮坪建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。成都創新互聯公司從事“鎮坪網站設計”,“鎮坪網站推廣”以來,每個客戶項目都認真落實執行。

前言

剛接觸到JavaScript的時候,便知道JavaScript是按順序執行的,是如瀏覽器的解析DOM樹一樣的流程,解析DOM結構的時候,如果遇到JS腳本或者外聯腳本便會停止解析,繼續下載腳本之后,執行腳本,然后再解析DOM。

然而,卻因此常常碰到問題。

看如下代碼以及輸出:

var name;
console.log(name);  // undefined
name = 'tom';

age = 10;
var age;
console.log(age); // 10

上面的代碼讓我們產生了疑惑,我們僅僅聲明了name的時候,打印出來值是undefined,按理說,重新聲明age之后,age的值應該也是undefined才對,但是輸出來的卻是10。這究竟是怎么回事兒呢?

我們的通用解釋是,遇到了變量提升。

而這樣的情況,我們在函數中也會看到,請看下面代碼:

log();
console.log(name);
var name = 'tom';
function log() {
  console.log('this is log');
}

上面代碼的輸出結果是什么?

輸出結果:

this is log
undefined

為什么會產生這樣的情形呢?我們通用的解釋是,函數聲明提升了。

而針對這兩種情況,就是我們經常遇到的提升機制,也就是我們常說的Hoisting。

而僅僅只是一句提升機制來解釋這種現象,還是覺得云里霧里,要是我之前可能也就不明覺厲的哦了一聲,然后就不再理會這樣的東西了,那么究竟為什么會出現這樣的情況呢?

JavaScript是如何被編譯的呢

有時候我們會想,一段JS代碼是如何執行的呢?其實,在JS代碼被執行之前,通常都有一個編譯過程。

這個編譯過程其實很復雜,但總體來說,逃不過編譯過程的步驟,只不過JavaScript是在這個步驟之中對代碼做了優化處理。

第一、詞法分析

詞法分析主要是將一段程序分解成有意義的代碼塊,便于對分解的代碼塊做解析。

比如,var age = 10;這一段代碼將會被分解成 var、age、=、10、;。這是5個詞法單元。

這些單元分析完畢之后,便會給解析器調用,生成相應的AST(抽象語法樹)。

第二、解析詞法單元

解析詞法單元,是為了生成AST,那么到底什么是AST呢,我們來看一段代碼以及解析生成的AST。

JavaScript提升機制Hoisting的示例分析

同樣是var age = 10;這段代碼,被解析器解析成了一段樹形結構的結構,這個結構,就是抽象語法樹AST。你可以通過這個網站來查看生產的AST:AST解析器

而抽象語法樹,又是可以轉換成可執行代碼。這就涉及到編譯的第三個階段。

第三、生成可執行代碼

生成可執行代碼的過程,相當于是再把AST轉換成瀏覽器可執行的代碼,或者是各種語言引擎可執行的代碼。

比如我們常見的babel,可以讓我們用ES6的語法去開發程序,其實就是依靠babel編譯器,將我們的ES6代碼編譯成ES6的AST,然后將ES6的AST轉換成ES5的AST或者ES3的AST,最后將AST轉成ES5或ES3的代碼來讓瀏覽器執行。

同理,TypeScript的TSC也是一個編譯器,做的事情和babel是一樣的,只不過兩者編譯出來的ES6的AST有略微的差別,這樣就造成了TypeScript用不了Babel社區的豐富多樣的插件,如eslint等。

因為eslint語法檢查,正是基于AST做的。

那么上面這個編譯過程有什么用呢?

JavaScript中的聲明和賦值

理解了語言的編譯過程,那么JavaScript中的聲明和賦值又是如何的一個流程呢?

比如,var age = 10;這段代碼,在JavaScript中的編譯方式是如何呢?

在JavaScript中,這段代碼大概相當于是如下兩個過程:

var age = undefined;   // 隱式賦值,編譯階段
age = 10;  //變量賦值  執行階段

函數聲明也是如此:

// 這一段代碼就是一個完整的函數聲明,在編譯階段中,會先執行所有聲明,才會依次執行代碼操作。
function log() {
  console.log('this is log')
}

這個時候,我們再回頭來,想一下提升機制是什么?

再看提升

JavaScript的執行,被分為了兩個階段,分別是編譯階段,以及執行階段。依照這個來看,所謂的提升機制(有的叫做變量提升,考慮到函數的定義,并未用這個名詞),就是JavaScript引擎把變量聲明和函數聲明在編譯階段首先進行默認賦值,之后,在程序執行階段,才會被代碼真正的執行。也就是說,針對聲明先提升,后執行。

注意:函數聲明和變量都有提升機制,兩者之間也有優先級。這都遵循一個原則:函數優先原則。也就是說,函數聲明會提升到普通變量聲明之前。

以上是“JavaScript提升機制Hoisting的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創新互聯行業資訊頻道!

文章名稱:JavaScript提升機制Hoisting的示例分析-創新互聯
轉載源于:http://www.2m8n56k.cn/article16/dsihdg.html

成都網站建設公司_創新互聯,為您提供云服務器網站改版網站制作商城網站自適應網站虛擬主機

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

網站托管運營
主站蜘蛛池模板: 超清波多野结衣精品一区 | 九九久久久久午夜精选 | 久久成人a毛片免费观看网站 | 中文字幕亚洲精品 | 九九精品国产兔费观看久久 | a级片在线观看 | 中文亚洲欧美 | 欧美一级高清在线观看 | 手机在线视频一区 | 中文字幕亚洲国产 | 看一级毛片一区二区三区免费 | 午夜桃色剧场 | 最近最新中文字幕免费的一页 | 欧美第一视频 | 成人久久影院 | 韩国美女爽快一毛片免费 | 久久综合狠狠综合久久综合88 | 久久99久久成人免费播放 | 在线观看精品国内福利视频 | 岛国午夜精品视频在线观看 | 亚洲国语在线视频手机在线 | jizzjizz成熟丰满舒服 | 中文字幕视频网 | 成人精品视频一区二区三区 | 一级毛片免费完整视频 | 久久精品国产国产 | 国产精品香蕉一区二区三区 | 欧美xxxx性xxxxx高清视频 | 玖草视频在线观看 | 国产精品二区高清在线 | 秋霞手机入口二日韩区 | 国产日韩一区二区三区在线播放 | 欧美精品一区二区三区视频 | 亚洲欧美精品成人久久91 | 国产乱码一区二区三区四川人 | 毛片免费观看日本中文 | 亚洲国产一区二区三区最新 | 久热香蕉在线视频 | 亚洲久久久 | 国产成人免费网站 | 国产在线视频欧美亚综合 |