在此我會講es5中var和function的弊端;let和const的優勢及特點
一、function
關於es5中function主要有三大缺點。
1、宣告提公升
在編譯階段前,js引擎會遍歷一遍全域性作用域(並不是函式作用域)中的函式宣告,並且進行函式賦值。
tosay()
// 埋埋超可愛
inside()
// inside is not defined
function
tosay()
}
2、塊級內宣告非法
在es5規定中,在塊級中宣告函式是非法的。但是瀏覽器並不完全遵循,也就是說js引擎即不會報錯,也不會將其預處理為全域性函式。
tosay()
// tosay is not a functionif(
true
)}
3、函式替換
也就是說你在某個塊級或則函式內定義了乙個與外部名稱相同的函式,從而外部函式被內部函式利用宣告提公升所替換。
function
tosay()
// 在塊級內被替換if(
true)}
// 在函式內被替換
function
wrap()
}wrap
()
二、var
關於es5中var也類似function主要有三大缺點。
1、宣告提公升
在編譯階段前,js引擎會遍歷一遍全域性作用域(並不是函式作用域)中的變數宣告,但是並不進行賦值,預設為空字元。
console.
log(name)
var name =
'埋埋'
注意:第一次時為空字元,當你再次重新整理頁面時,由於已經賦值便列印你所賦予的值,比如:埋埋。
2、變數替換
也就是說你在某個塊級內定義了乙個與外部名稱相同的變數,從而外部變數被內部變數所替換。
var name =
'埋埋'
// 在塊級內被替換if(
true
)console.
log(name)
// chujiu
3、塊級內部變數洩露外部
由於var不具備塊級作用域,從而導致在塊級內部定義變數,其外部可以直接訪問。
for
(var count =
0; count <
5; count++
)console.
log(count)
// 5
三、let/const
關於es6中let/const主要有三大優點。
1、不存在宣告提公升
console.
log(name)
// name is not defined
let name =
'埋埋'
// const同類
2、塊級作用域
let name =
'埋埋'if(
true
)console.
log(name)
// 埋埋
// const同類
3、暫時性死區
在塊級作用域中,宣告乙個與外部相同名稱的變數,塊級作用域內訪問這個變數在其宣告之前,會報錯。
let name =
'埋埋'if(
true
)// const同類
四、特性
1、let可改變,const不可改變
2、當const儲存的是某個引用型別的指標位址,它凍結的只是這個位址而非引用型別內部值,因此其內部是可以增刪改屬性的。
3、空窗區(塊級作用域內定義的變數,外部訪問,始終為空字元)
if
(true
)console.
log(name)
// 空字元
// const同類
ES6學習 let和const命令
1.let命令 所宣告的變數命令所在 塊有效 a referenceerror a is not defined.b 1for迴圈的計數器,就很適合let命令 for let i 0 i arr.length i console.log i referenceerror i is not defin...
ES6 一 let和const命令
在js中是沒有塊級作用域的,var 宣告的變數作用域是整個函式體,而let可以起到這一作用 console.log b 2 console.log a a is not defind 而let可以起到這一作用啊在js中變數和函式的宣告會提公升到當前作用域最頂部執行。這樣就會出現問題。var a 函式...
ES6學習 let和const命令
說明 本文參考阮一峰的ecmascript 6 入門 console.log a 塊外使用會報錯 referenceerror a is not defined for迴圈內使用let和var產生的不同效果 下面 使用的是var,結果為10 var a for var i 0 i 10 i a 9 ...