關於js的各種變數提公升機制

2021-10-09 12:16:51 字數 2999 閱讀 8742

js中,傳統宣告變數是var、function;es6中是let、const、import。今天說一下前四種的異同。

let 和 const

letconst都是宣告乙個變數,但是const宣告的變數不允許指標重新指向,且const宣告的時候必須賦值,否則會報錯。

變數賦值本質上就是乙個指標指向的過程。const變數的值如果是引用資料型別的話,那麼是可以改變裡面的值的(這並不會改變指標的指向)。

letconst不存在變數提公升,所以必須先宣告後使用。

3.letconst宣告的變數並不會給全域性物件go(window)增加屬性。所以帶宣告的變數和不帶宣告的變數是不一樣的機制,平時寫的時候不要省略。

如果變數不帶任何宣告,則預設是給全域性物件go(window)增加屬性,該變數就不會提前宣告。

5. 同一上下文中,let不允許重複宣告

let 的檢測是否重複宣告發生在詞法解析階段(js**自上而下執行,瀏覽器會提前處理很多事情,例如詞法解析—>變數提公升—>**執行 等)。一旦在詞法解析這一階段報錯,js**一行都不會執行的。

var 和 function

varfunction宣告的變數都存在變數提公升機制,而且function宣告的變數會提前宣告+定義。

基於varfunction宣告的全域性變數會給全域性物件go(window)增加乙個對應的私有屬性,它們之間有乙個對映機制(乙個修改,另乙個也會跟著修改)

上下文中變數提公升的細節點

**執行分為:全域性**,函式中的**,私有塊的**……不同環境下的**執行都有著自己的上下文。

if(!

("a"

in window)

)console.

log(a)

;//undefined

塊級上下文中,只有基於let/const/function宣告的變數,才是塊級上下文私有的

if(1

==1)consolo.

log(n)

;//12

if(1

==1)consolo.

log(n)

;//uncaught referenceerror: n is not defined

if(1

==1)console.

log(m)

;//13

console.

log(n)

;//uncaught referenceerror: n is not defined

在全域性中,函式此時是只宣告(針對新版本瀏覽器);在塊級私有上下文中,函式是提公升宣告+定義。

但是在塊級私有上下文中,會把裡面對function ***(){}這一部分**(包括這一部分)之前的操作「對映」給全域性乙份,此後的**操作就是私有的了,與全域性無關。

console.

log(fn)

;//函式在全域性中只是提前宣告*****> undefinedif(

1==1)

fn =12;

console.

log(fn)

;//12

}console.

log(fn)

;//私有上下文的對於fn的定義對映給全域性乙份了*****>fn

注意裡面說的兩個條件哈,缺一不可!

這裡形成塊級私有上下文後,只有在裡面(函式的大括號)中新宣告的變數才是塊級上下文私有的。且塊級上下文的上級上下文是函式私有上下文

var x =1;

function

func

(x,y

=function

annoymous()

)func(5

)console.

log(x)

;//1

//這裡函式有形參預設值,但是函式體內沒有基於var/let/const宣告的變數,所以並不滿足形成塊級私有上下文的條件

var x =1;

function

func

(x,y

=function

annoymous()

)func(5

)console.

log(x)

;//1

var x =1;

function

func

(x,y

=function

annoymous()

);//y是新宣告的,執行y,塊級私有上下文的x變為4y(

);console.

log(x)

;//4

}func(5

)console.

log(x)

;//1

js變數提公升機制

宣告 declare var a function sum 預設值undefined 定義 defined a 12 定義其實就是賦值操作 變數提公升階段 帶 var 的只宣告未定義 帶 function 的宣告 和賦值都完成了。變數提公升只發生在當前作用域 例如 開始載入頁面的時候,只對全域性作用...

js提公升機制(hoisting)

這是我申請寫的第一篇文章,想把這兩天學習的關於js的變數和函式提公升機制 hoisting 記錄下來。從網上看到這麼一段 varc 2 functionc a 10 這可不是對外面的全域性變數a定義哦 console.log a 10 區域性變數 vara 11 console.log a 11 區...

js變數提公升機制下重名的問題

帶var 和 function 關鍵字宣告相同的名字,這也算重名了 其實是乙個fn,只是儲存值得型別不一樣 fn 4 function fn fn 4 function fn fn 4 var fn 100 帶var 的在提公升階段只把宣告處理了,賦值操作沒有處理,所以在 執行的時候需要完成賦值 f...