為什麼javascript中有那麼多聲明變數的方式,明明是弱類型的語言,確有三個關鍵字? 最早的是var,這是es6之前的聲明方式,既然有了var為什麼還要有let 和 const呢? 原因很簡單,這是因為var有一些問題不夠方便。 首先是作用域,在一個函數內只要聲明一個var,內部可以任意調用,比 ...
為什麼javascript中有那麼多聲明變數的方式,明明是弱類型的語言,確有三個關鍵字?
最早的是var,這是es6之前的聲明方式,既然有了var為什麼還要有let 和 const呢?
原因很簡單,這是因為var有一些問題不夠方便。
首先是作用域,在一個函數內只要聲明一個var,內部可以任意調用,比如創建一個for迴圈使用var和let的效果。
作用域的區別
- var聲明之後函數內所有的都可以調用他 (var只有全局作用域和函數作用域沒有塊級作用域)
- let只會在塊級作用域 調用會報錯()
function 作用域(){
for (var var1 = 0; var1 < 1; var1++) {
console.log("var",var1)
}
for (let let1 = 0; let1 < array.length; let1++) {
console.log("let",let1)
}
}
function print_one(){
if(true){
var one = 1;
}
console.log(one); //1
}
console.log(one);//not definde
function print_one(){
if(true){
let one = 1;
}
console.log(one); //not definde
}
console.log(one);//not definde
變數的聲明提升
- var 可以在聲明語句前調用
- let 必須聲明之後才能調用
- 出現這樣的問題,是因為代碼通過js的解釋器的預編譯,這個操作會優先掃描所有的代碼吧變數聲明語句提取到所有代碼執行之前,而賦值語句保持位置不便從而導致
if(false){
var one = 1;
}
// 應該報錯 但是居然能列印出來
console.log(one) // undefinde
// 實際上相當於這樣
var one
if(false){
one = 1;
}
// 應該報錯 但是居然能列印出來
console.log(one) // undefinde
重覆聲明
- var可以重覆聲明
- let 不能在統一作用域下重覆聲明
- const 聲明的時候就必須要賦值,否則報錯 同時也不能在同一作用域下重覆聲明