JS中var、let、const關鍵字

var與let

相同點: 聲明變量,被聲明的變量的值可以被修改。如果聲明時沒有被賦值,默認值爲undefined。
不同點: 變量作用域不同。var 聲明的變量具有全局性而且有提前聲明的效果。let關鍵字具有塊級作用域就是在大括號有用,出了這個塊級作用域就銷燬了。

if (true) {
	var uname = "李雷"; //用var聲明變量
    company = "娃哈哈";//沒有用var聲明,那麼他會先找當前作用域是否有申明,然後再向外不去尋找。會提前聲明
    let sex = "男";// 用let關鍵字聲明變量
    console.log(sex); //男
}
console.log(uname);//李雷
console.log(company);//娃哈哈
console.log(sex);//報錯: Uncaught ReferenceError: sex is not defined  因爲sex是用let關鍵字聲明的,所以作用域只在大括號內,出了大括號就銷燬了,所以會報錯。

易錯點(面試技巧)
仔細觀察下面兩段代碼

//代碼一
var arr = []; //聲明空數組
for (var i = 0; i < 2; i++) {
	arr[i] = function() { //向數組中添加元素(這裏的元素是一個方法)
    	console.log(i);
    }
}
arr[0](); //結果 :2
arr[1](); //結果 :2
//代碼二
var arr = []; //聲明空數組
for (let i = 0; i < 2; i++) {
	arr[i] = function() { //向數組中添加元素(這裏的元素是一個方法)
    	console.log(i);
    }
}
arr[0](); //結果 :0
arr[1](); //結果 :1

上方兩段代碼唯一不同點就是 for 循環中的變量 i 一個使用 var 另一個是用 let ,然而結果卻是大不相同。
解析:

  • 代碼一:由於var關鍵字命名的變量具有全局作用域的效果,當循環結束後 i 的值爲2。數組中的元素需要打印當前 i 的值,索引就打印除了現在全局存在的i的當前值2.
  • 代碼二:由於let關鍵字命名的變量具有塊級作用域的效果。第一次循環i的值爲0,添加到數組中,當循環結束後 i 出了這一次的塊級作用域就被銷燬了。進入第二次循環時,又創建了一個塊級作用域,同理第二次也是一樣。每次循環都會創建一個塊級作用域。i 就保持了當前作用域的值。所以最後的結果爲 0,1

const與let

相同點: 作用域都是塊級作用域
不同點: const聲明時必須賦初始值,並且賦值過後就不能修改了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章