扒一扒JavaScript 預解釋

來源:互聯網
上載者:User

標籤:

帶var關鍵字預解釋

讓我們先看下這段代碼執行的結果:

 

代碼如下:
alert(n);//彈出undefined
var n = 10;

 

彈出的結果是undefined,為何不是10?讓我們再看下面這段代碼執行的結果:

 

代碼如下:
alert(n);
n = 10;

 

運行報如下錯誤:

為何這次會報錯,原因是代碼在啟動並執行時候,沒有聲明這個變數n;通過這兩段代碼的比較,我們發現帶var關鍵字和不帶var關鍵字聲明的變數是有區別的,帶var聲明的變數在代碼執行之前,似乎瀏覽器已經給了它們一個初始值undefined,因此我們將代碼執行前,瀏覽器引擎自動掃描帶var關鍵字和帶function關鍵字(後面會提到)聲明的變數和定義的函數的這個過程稱為預解釋。

帶function關鍵字預解釋

讓我們看下如下代碼執行的結果:

 

代碼如下:
fn();//彈出hello
function fn(){
    alert(‘hello‘);
}

 

執行結果彈出hello,fn能夠正常執行,原因是在代碼執行前fn被預解釋了,在預解釋時已經將fn定義(defined)了,我們又有疑問了,為何第一段代碼執行結果不彈出10,而是undefined,再次引入了另一個概念JavaScript中的聲明和定義。

JavaScript中的聲明(declare)和定義(defined)

我們通常用var關鍵來聲明變數,用function關鍵字來定義函數,只不過function關鍵字聲明和定義函數是同時執行的,而var它只能聲明變數,並不具備定義的功能。

如下是用var關鍵字聲明的變數:

 

代碼如下:
var n;//聲明了一個變數n
var m = 10;//聲明了一個變數m,並且將10賦值給它

 

如下是用function關鍵字定義的函數:

 

代碼如下:
//定義了一個函數fn
function fn(){
    alert(‘hello‘);
}

 

帶var關鍵字和帶function關鍵字預解釋的區別

其實它倆的區別就是帶var關鍵字預解釋時只預解釋聲明部分(因為它本身不具備定義的能力),而帶function關鍵字在預解釋時聲明和定義同時被預解釋。這時我們再回頭分析下第一段代碼,分析如下:

無節操(坑爹)的預解釋

為何說它無節操,請看下面的代碼(Firefox除外):

 

代碼如下:
alert(n);
fn();
if(false) {
    var n = 10;
    function fn(){
        alert(‘hello‘);
    }
}

 

第一行代碼執行會彈出undefined,第二行代碼執行會彈出hello;是因為n和fn在代碼執行前被預解釋了,即使if條件判斷為false,執著的瀏覽器引擎也會將帶var關鍵字聲明的變數n和帶function關鍵定義的fn掃描到。

*預解釋忽略重新聲明,不忽略重新定義

這個地方因為相對比較繞而且不太好理解,所以加了一個星號,請看如下代碼:

 

代碼如下:
alert(n);
var n = 10;
var n = 9;
var n;
alert(n);

 

這段代碼執行結果是什麼,我們來分析一下:

繼續上代碼,請分析如下執行結果:

 

代碼如下:
fn();
function fn() {
    alert(‘1‘);
}
fn();
function fn() {
    alert(‘2‘);
}
fn();


程式碼分析圖如下:

 

帶function定義的函數預解釋分析

總結:

本篇博文用了大篇幅代碼和對JavaScript中預解釋作了概述,縱觀各種書籍對預解釋的描述甚少,其實平時在工作中使用的情境也並不多,遺憾的是預解釋是各大公司面試題必考。在剛開始接觸它的時候,感覺它總是不按照常理寫代碼,但是有些時候卻能夠正常運行並不會報錯,當然這也增加了我們對它神秘感的探索,也讓我們進一步瞭解瀏覽器引擎是怎麼解釋執行我們的代碼。特此在後面的博文中我會拿幾道經典的案例來綜合分析它,再次感謝大家的支援!

扒一扒JavaScript 預解釋

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.