一、沒有塊作用域的ES5 var
對於ES5的var,咱們經常用到,不知道大家注意到沒有,var 變量聲明,沒有塊作用域。例1:
for(var i=0;i<=5;i++){
console.log("hello");
}
console.log(i); //5
在if或者for循環中聲明的變量會泄露成全局變量,var i 是在塊中定義的,結果變成了全局變量。再看一個例子:例2。
var temp = new Date();
function f(){
console.log(temp);
if(false){
var temp = "hello";
}
}
f(); //undefined
上面是什麼原因導致console.log(temp)的輸出結果爲:undefined,這個是塊內的變量覆蓋了塊外的變量,導致temp沒有定義。
二、var、let、const的區別
- var定義的變量,沒有塊的概念,可以跨塊訪問, 不能跨函數訪問,有變量提升。
- let定義的變量,只能在塊作用域裏訪問,不能跨塊訪問,也不能跨函數訪問,無變量提升,不可以重複聲明。
- const用來定義常量,使用時必須初始化(即必須賦值),只能在塊作用域裏訪問,而且不能修改,無變量提升,不可以重複聲明。注意:const常量,指的是常量對應的內存地址不得改變,而不是對應的值不得改變,所有把應用類型的數據設置爲常量,其內部的值是可以改變的,例如:const a={}; a.b=13;//不會報錯 const arr=[]; arr.push(123);//不會報錯
-
let 聲明的變量只在塊級作用域內有效
'use strict';
function func(args){
if(true){
let i = 6;
console.log('inside: ' + i); //不報錯
}
console.log('outside: ' + i); // 報錯 "i is not defined"
};
func();