1.var在if語句內聲明變量
console.log(name); // 輸出為空
if(true){
console.log(name); // 輸出為空
var name="bonly";
console.log(name); // 輸出為bonly
}
console.log(name); // 輸出為bonly
console.log(name); // 輸出為空
aa()
function aa(){
if(true){
console.log(name); // 輸出為undefined
var name="bonly";
console.log(name); // 輸出為bonly
}
console.log(name); // 輸出為bonly
}
console.log(name); // 輸出為空
小結:在if內用var聲明變量,雖然if后面是塊級作用域,但是var聲明的變量不支持塊級作用域,該變量會向上冒泡到支持的作用域范圍,也就是函數作用域和全局作用域
2.var在for語句內聲明變量
console.log(i); // 輸出為undefined
for (var i=0;i<5;i++) {
console.log('內部獲取的'+i);
}
console.log('外部獲取'+i); // 輸出5
小結:在for循環內用var聲明變量,該變量也是全局的
3.let在if語句內聲明變量
console.log(name); // 空,沒有報錯
if(true){
let name="bonly";
console.log(name); // bnonly
}
console.log(name); // 空,沒有報錯
// 千萬注意,別以為是文檔定義錯了,這里沒有報錯的原因是window對象上有name屬性,並且為“”,坑不坑
console.log(aaa); // 報錯
if(true){
console.log(aaa); // 報錯
let aaa="bonly";
console.log(aaa); // bnonly
}
console.log(aaa); // 報錯
小結:在if內用let聲明變量,該變量是局部的,並且沒有變量提升
4.let在for語句內聲明變量
console.log(i); // 報錯
for (let i=0;i<5;i++) {
console.log('內部獲取的'+i);
}
console.log('外部獲取'+i); // 報錯
小結:在for內用let聲明變量,該變量是局部的,並且沒有變量提升