JS中的變數宣告提公升

2022-07-21 18:18:14 字數 896 閱讀 7675

js是一種指令碼語言,和一些高階語言不同,它沒有完整編譯的過程,一般是邊寫邊編譯,這也是我們覺得指令碼語言比其他語言載入快的原因,其實,js中有變數宣告提公升這一機制。當js在執行的時候會分為2個階段,預解析,執行,當js在執行的時候會將所有用var宣告的變數以及關鍵字定義的函式進行提公升(  function  fn()  ),提公升到當前作用域的最頂端,而賦值語句在原地等待執行,預解析後,再從上往下逐行解析**。預解析遵循一些原則,下面一點一點的說明。

提到變數宣告提公升,就得結合作用域來分析,也就是區域性作用域能訪問到全域性的變數,而全域性作用域訪問不到區域性作用域。

例:var a=1;

function fn()

alert(a);

var a=3;

alert(a)

function a()

alert(a)

a();

第一看到這些**誰都頭大,不過我們來一點一點的看。

首先,js執行**會先進行預解析,var 的a拿到當前作用域的頂部,此時頂部有乙個a,往下走,就找var 和關鍵字定義的函式,function a(){},又找到乙個,然後它會把原來頂部的a替換掉,當遇到重名的變數只會留乙個,遇到函式,函式的優先順序高,所以留函式,此時頂部的a為乙個函式體,也就是function a(),又找到下乙個函式a,   a又被替換掉,預解析過程就完成了,再逐行解析**,讀到第一行,要彈a,此時預解析頂部的a是function a(),所以會彈出這個函式體,再讀,給a賦值1,那麼下次會彈出1,再走,碰到函式體,但不是賦值語句,對a沒有影響,繼續往下走,再彈1,宣告乙個a並賦值為3,再彈,會彈出3,再遇見函式,不是賦值語句,對a沒影響,再彈,還彈3,最後呼叫a,但此時a是3,不是函式,所以會報錯。總結,以上**會依次彈出   function a()    ,   1,   1,  3,   3    ,   報錯。

JS變數宣告提公升

js的變數作用域是離它最近的封閉語塊或 塊,包含他們內部的函式.在 塊中宣告會被隱式的提公升到封閉函式的頂部 1 function 6 var y 1 7 上面的 會被js解釋成下面的格式 1 function 8 有時候我們會不小心的在函式內部重新宣告了已有的變數 function text x ...

JS變數宣告和函式宣告提公升

很多時候,在直覺上,我們都會認為js 在執行時都是自上而下一行一行執行的,但是實際上,有一種情況會導致這個假設是錯誤的。a 2 var a console.log a 按照傳統眼光,console.log a 輸出的應該是undefined,因為var a在a 2之後。但是,輸出的是2。再看第二段 ...

JS中的變數宣告提公升與函式宣告提公升優先順序

今天在群裡看到了一道題,如下。問輸出什麼?var c 1 function c c c 3 看到的第一眼,第一想法就是這題考察的是變數提公升,唔,應該是輸出undefined。結果不對,報錯了 為啥呢?原來在乙個作用域中,變數宣告是有順序的 函式形參宣告 函式宣告 變數宣告 任何一種宣告,如果在前面...