1召烂、在全局作用域下聲明變量:
console.log(a); // undefined => 變量提升碱工,已經(jīng)聲明,未定義
console.log(window.a); // undefined // 屬性已掛載,未賦值
console.log('a' in window); // true // 屬性已掛載
var a = 12; // 賦值
console.log(a); // 12
console.log(window.a); // 12
// 在全局作用域下聲明變量怕篷,也相當(dāng)于給 window 全局對(duì)象設(shè)置了一個(gè)屬性历筝,變量的值就是屬性值;
// (私有作用域中聲明的私有變量和 window沒(méi)有什么關(guān)系)廊谓;
2梳猪、聲明變量時(shí)使用 var 和 不使用var 的區(qū)別:
// 不使用 var 聲明變量,相當(dāng)于給 window 全局對(duì)象添加一個(gè)屬性蒸痹,不是變量不存在提升
console.log(a); // Uncaught ReferenceError: a is not defined春弥;無(wú) a 這個(gè)變量,報(bào)錯(cuò)叠荠;
console.log(window.a); // undefined => 無(wú)變量提升匿沛,window無(wú) a 這個(gè)屬性
console.log('a' in window); // false => 無(wú)變量提升,window無(wú) a 這個(gè)屬性
a = 12; // 給 window 添加 a 屬性
console.log(a); // 12
console.log(window.a); // 12
3榛鼎、聲明變量的方式不同逃呼,意義不同
var a = 12,
b = 13;
// 相當(dāng)于 var a = 12; var b =13;
var a = b = 12;
// 相當(dāng)于 var a = 12; b = 12;
4、引出作用域鏈
console.log(a,b); // undefined, undefined
var a = 12,
b = 13;
function fn () {
console.log(a,b); // undefined, 13
var a = b = 12;
console.log(a,b); // 12, 12
}
fn(); // 12, 12
console.log(a,b);
作用域鏈.png