js中,傳統宣告變數是var、function;es6中是let、const、import。今天說一下前四種的異同。
let 和 const
let
const
都是宣告乙個變數,但是const宣告的變數不允許指標重新指向,且const宣告的時候必須賦值,否則會報錯。
變數賦值本質上就是乙個指標指向的過程。const變數的值如果是引用資料型別的話,那麼是可以改變裡面的值的(這並不會改變指標的指向)。
let
const
不存在變數提公升,所以必須先宣告後使用。
3.let
const
宣告的變數並不會給全域性物件go(window)增加屬性。所以帶宣告的變數和不帶宣告的變數是不一樣的機制,平時寫的時候不要省略。
如果變數不帶任何宣告,則預設是給全域性物件go(window)增加屬性,該變數就不會提前宣告。5. 同一上下文中,
let
不允許重複宣告let 的檢測是否重複宣告發生在詞法解析階段(js**自上而下執行,瀏覽器會提前處理很多事情,例如詞法解析—>變數提公升—>**執行 等)。一旦在詞法解析這一階段報錯,js**一行都不會執行的。var 和 function
var
function
宣告的變數都存在變數提公升機制,而且function
宣告的變數會提前宣告+定義。基於
var
function
宣告的全域性變數會給全域性物件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...