1.在ES5中,顶层对象的属性和全局变量是等价的,var 命令和 function 命令声明的全局变量,自然也是顶层对象
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规定,var 命令和 function 命令声明的全局变量,依旧是顶层对象的属性,但 let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性
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'
变量提升只局限于当前的函数,不会提升到函数外面
console.log(a)
var fn = function () {
console.log(a);
var a=2;
console.log(a)
};
fn() // 会直接报错
var可以重复声明一个变量只在自己的作用域和子作用域生效,可以理解为一旦在函数中使用var声明变量a,就在函数的顶部先声明了a=undefined,然后再运行到var的时候给a赋值;
重复声明变量
var zs = 2
var zs = 4
zs // 4
函数块中声明的var变量不会影响函数之外的相同名字的的变量
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