es6中的变量声明
变量的声明
for (var i = 0; i < 5; i++) {
console.log(i)
}
var声明
作用域问题
上面的就是一个简单的for循环语句,在每次循环变量i的时候答应当前i的值.但是在上面的代码基础上加入几行,我们再试试看。
for (var i = 0; i < 5; i++) {
console.log(i)//0,1,2,3,4
}
console.log(i)//5
console.log(window.i)//5
你会发现变量i的值还是会被答应出来,更加过分的是在全局变量window上面竟然也可以拿到变量i的值,这很显然是不严谨的,也不是我们想要的,于是es6就对变量声明有了下面的修改。
重复声明问题
看下面的代码:
var a=1;
var a=2;
这样声明的变量不会报错,es5中会解析成下面的代码:
var a;
a=1;
a=2;
let声明
作用域问题
在es5中我们使用let关键字来声明变量。还是同样的代码,我们看看有什么不一样的效果:
for (let i = 0; i < 5; i++) {
console.log(i)//0,1,2,3,4
}
console.log(i)//i is not defined
console.log(window.i)//undefined
你会发现在for循环内部我们依然可以拿到每次的打印结果,这是正确的,也是我们所期望的,但是。在循环体之外就不能获取到变量i了,提示错误为未定义,全局变量上也不能获取i的值。这是因为在es6中引入了模块的概念,我们可以认为整个for循环是一个模块,在模块内部声明的变量只能在模块里面用。你也可以认为es6隐式的帮我们在for循环之外加入一个自执行函数:
(function () {
for (var i = 0; i < 5; i++) {
console.log(i)//0,1,2,3,4
}
}
)()
console.log(i)//i is not defined
这样变量就不是声明在全局,也就不会被全局污染了。
重复声明问题
let a=1;
let a=2;
但是在es6中上面说到的作用域问题,所以es6中并不会存在变量提升的问题,也就是说你相当于重复声明了变量a,所以会报错。‘'a' has already been declared’
const声明
const 引入了常量的概念,常量一般为固定的值是不能修改的,提示常量不能被修改(Assignment to constant variable.)
const a=1;
a=2;
但是const不能修改的是这个值的引用空间,如果代码这样写,就不会报错:
const a = { name: 'hello', age: 0 };
a.age = 1;
console.log(a)//{ name: 'hello', age: 1 }