1.在ES5中,頂層對(duì)象的屬性和全局變量是等價(jià)的,var 命令和 function 命令聲明的全局變量,自然也是頂層對(duì)象
var a = 12;
function f(){};
console.log(window.a) // 12
console.log(window.f) // f(){}
console.log(this.a) // 12
console.log(this.f) // f(){}
2.但ES6規(guī)定,var 命令和 function 命令聲明的全局變量,依舊是頂層對(duì)象的屬性,但 let命令、const命令、class命令聲明的全局變量,不屬于頂層對(duì)象的屬性
let a = 12;
let zs = function f(){};
console.log(window.a) //undefined
console.log(window.zs)//undefined
console.log(this.a)//undefined
console.log(this.zs)//undefined
3.var 存在變量提升,允許在沒有聲明變量之前使用變量,即將變量聲明悄悄提升到使用變量之前
console.log(zs) // undefined
var zs = 'zs'
console.log(zs) // 'zs'
變量提升只局限于當(dāng)前的函數(shù),不會(huì)提升到函數(shù)外面
console.log(a)
var fn = function () {
console.log(a);
var a=2;
console.log(a)
};
fn() // 會(huì)直接報(bào)錯(cuò)
var可以重復(fù)聲明一個(gè)變量只在自己的作用域和子作用域生效,可以理解為一旦在函數(shù)中使用var聲明變量a,就在函數(shù)的頂部先聲明了a=undefined,然后再運(yùn)行到var的時(shí)候給a賦值;
重復(fù)聲明變量
var zs = 2
var zs = 4
zs // 4
函數(shù)塊中聲明的var變量不會(huì)影響函數(shù)之外的相同名字的的變量
console.log(a)
var a = 1;
console.log(a)
var fn = function () {
console.log(a);
a=3;
console.log(a)
var a=2;
console.log(a)
};
fn()
console.log(a)
// undefined
// 1
// undefined
// 3
// 2
// 1