ES6 提出了两个新的声明变量的命令:let
和const
。其中,let
完全可以取代var
,因为两者语义相同,而且let
没有副作用。
作用域
let和const声明的变量属于块作用域、var声明的变量作用域是全局或者整个封闭函数。
举例
var x = 1 //声明在全局作用域
function foo(){
var x = 2 //声明在函数作用域
console.log('two',x)
}
console.log('one',x)
foo()
//output:one 1 two 2
var x = 1 //声明在全局作用域
function foo(){
x = 2 //赋值给变量x
}
foo()
console.log(x)
//output:2
函数里没有声明x,而是赋值给全局作用域下的变量x。
var x = 1
function foo(){
y = 2
}
foo()
console.log(global.y)
//output:2
如果赋值给没有声明的变量,该变量会隐式地创建为全局变量,成为顶层对象的属性。
所以var具有缺陷:所有未声明直接赋值的变量都会自动挂在顶层对象下,造成全局环境变量不可控、混乱。
{
let x = 1
}
console.log