一、let,const
- 在es5中没有块级作用域,只有函数作用域和全局作用域,例如{ }不能成为一个作用域,但在es6中可以
for(var i=0;i<4;i++)
{}
console.log('i:',i);//4
这是因为i是在全局的,最后打印的是for循环里面最后的结果。用let替换var则结果为not defined。
for(let i=0;i<4;i++){
}console.log('i:',i);//i is not defined
这是因为let形成了一个块级作用域
2. let、const没有变量提升
先来看看var 变量提升的一个小例子
console.log(a);
var a=0;
}
f();//undefined```这段代码在执行顺序为```function f(){
var a;//变量提升
console.log(a);
a=0;//变量赋值
}
f();//undefined```如果用let,则结果为```function f(){
console.log(a);
let a=0;
}
f();//is not defined
注意undefined跟is no defined是不同的,undefined是一个类,在这里表示变量有定义但没有赋值,而后者则意味没有定义变量。
3. 暂时性死区
var a=0;
function f(){
console.log(a);
let a;
}
f();//a is not defined
先定义了var变量,后面再在函数中let变量,形成了块作用域,由于变量名相同,所有会导致var失效
4. 不能重复定义
let a;
let a;
}//报错
const类似
5. let块级写法可以代替立即执行匿名函数
let config;
{
config=[];
config.push(1);
config.push(2);
console.log(config);
}//[ 1, 2 ]
6.在es6中函数不被提升,这部分到函数部分再一起来分析。
7. 一个简单的例子let实现闭包的效果
var arr=[];
function f(){
for(var i=0;i<5;i++)
{
arr.push(function(){
console.log(i);
});
}
}
f();
arr[1]();//5
arr[2]();//5
arr[3]();//5
这段代码总是打印出5,现在使用闭包使其输出0~4
var arr=[];
function f(){
for(var i=0;i<5;i++)
{
arr.push((function(i){
return function(){
console.log(i);
}
})(i));
}
}
f();
arr[0]();//0
arr[1]();//1
arr[2]();//2
将第一段代码的for循环中的var改为let,即可实现第二段代码的效果。
8. const定义常量后不能再被修改
const a=0;
function f(){
a=1;
console.log(a);
}
f();//报错
那么现在来看看这段代码
const a=0;
function f(){
a=1;
console.log(a);
}
f();//报错
咦,这里为什么有可以修改呢?请注意,这里指的不能修改是指不能修改变量的地址,也即使地址指针。如果要彻底是其不能修改,那可以用freeze();方法冻结它。在原来的代码上添加
Object.freeze(a);
a.sex='girl';
则会报错Can’t add property sex, object is not extensible。接下来会有一系列笔记,相信自己详细内容会整理的更加的详细。题外话:本人也是es6初学,没有太多的经验,写博客纯属是为了这里自己的笔记和一些想法,若有哪位仁兄仁姐看了本人文章,欢迎指点。