以前我们在定义变量时用的是 var ,而es6 又给我们提供了两种方法 let 和 const (const 是定义常量的)。今天我就来总结一下let 和const 。比较简单,大神么鸟我。
一、let 定义变量。
我们使用let定义的变量和 es5 中 var 定义的变量具有一下区别。
1. let定义的变量具块儿级有作用域
什么是块儿级作用域,就像 {}
花括号内的,为块儿级作用域。所以let 在块级作用域内声明后,块儿级作用域外面是访问不到的。
function a(){
let b = 10;
console.log(b) //10 可以方问
}
a();
console.log(b); //报错 Uncaught ReferenceError: b is not defined
而如果我们将上面的 let 改为 var声明变量是不会出现报错的。这个let 声明的变量很好的解决了我们以前的闭包问题。 闭包问题不懂的可以看看我以前文章http://blog.csdn.net/webxiaoma/article/details/53213113
我们如果用var 声明变量会产生以下情况
function a(){
var b = 10;
function c(){
b++;
console.log(b)
}
return c;
}
d = a();
d(); // 11
d(); // 12
这是应为 当变量d 引用 函数c时 形成了闭包。变量b 在被引用后不会立即回收,而是存储起来了。所以每次执行d(); b变量都会累计加一,有时候我们需要改变这种情况,以前我们会这么做。
function a(){
var b = 10;
(function c(){
b++;
console.log(b)
})()
}
a(); // 11
a(); // 11
其实现在我们完全可以用es6的let去这么写
function a(){
let b = 10; // 只需要将我们第一次的代码的 var 改为 let即可。
function c(){
b++;
console.log(b)
}
return c;
}
d = a();
d(); // 11
d(); // 11
2. let定义的变量不会被提升。
let 声明的变量是不会被提升的。例如在es5中我们这样做。
console.log(a) //结果 underfind
var a = 5;
浏览器并不会报错而是 underfind,这是因为变量a 被提升了,不知道变量提升 原则的可以看看我以前的文章:http://blog.csdn.net/webxiaoma/article/details/52431203
而我们用let声明的变量 这样写浏览器会直接报错
console.log(a) //Uncaught ReferenceError: a is not defined
let a = 5;
3. let定义的变量不能够被覆盖,但是值可以被修改。
let声明的变量不可以被修改,例如:
let a = 5;
let a =6;
console.log(a) //报错 'a' has already been declared
而如果是用var 去声明的变量,会直接覆盖掉a以前的值。虽然let声明的变量不可以被修改,但是我们可以更改它的值
例如:
let a = 5;
a =6;
console.log(a) // 结果 6;
一、const 定义常量。
1.什么是常量,常量在es6 中是不能被修改的。
const声明的常量 同样具有let
的上述三个特点。唯一不同的是,let声明的变量,变量指针是不能被修改的,但是指针所指的地址的值是可以被修改的,而const声明的常量,是都不可以被修改的,否则浏览器会错。
const a = 5;
a =6;
console.log(a) //报错 Assignment to constant variable.
上边代码运行会报错,而let和var声明的变量是不会报错的。
es6的这些写法,对我个人来说感觉还是挺好的,方便,对我们写代码也去起到一定的规范作用。