ES6学习笔记--var,let,const详解
前言:
let
和const
是 ES6 新增的命令,用于声明变量,这两个命令跟 ES5 的var
有许多不同,并且let
和const
也有一
些细微的不同,在认真阅读了阮一峰老师的文档后,发现还是有一些不知道的细节,重新整理了一下,分享给各位.
var特性
1.全局变量
var a=[ ]
for(var i=0;i<10;i++){
a[i]=function(){
console.log(i)}
}//10 10 10 10 10
console.log(i) //10
var变量在for中的声明在外头可以访问到复制代码
2.函数作用域
function world() {
var abc = 'hello'
console.log(abc)
}
world() // hello
console.log(abc) // ReferenceError: abc is not defined 在函数外面访问不到复制代码
3.变量提升:
提升到作用域顶部
例子1.a=10 //undefinedvar a
例子2.var a = 10;
function f1(){
console.log(a); //undefined
var a = 20; //var a 提升到该作用域顶部
console.log(a); // 20
}
f1()复制代码
4.可重复声明
var x=1 var x=2复制代码
let特性
1.块作用域
{let a=0}
console.log(a) //ReferenceError: a is not defined复制代码
每个let绑定自身所在的块作用域,且只能在块作用域中访问到
2.不可被重新声明
let abc = 'hello'
let abc = 'world' // SyntaxError: redeclaration of let abc复制代码
区别于var
3.暂时性死区
在声明之前使用会报错
console.log(a) //ReferenceError: a is not defined
var a=0 //在声明之前的语句为暂时性死区复制代码
4.导致typeof不安全
//正常情况 一个变量没有声明前使用typeof 结果为undefined
typeof b ; //undefined
//在暂时性死区内使用typeof,会报错
typeof c//报错let c复制代码
const特性
1.不可修改
const a=1;
a=2;//报错复制代码
并非真正意义上的不可修改,而是const指向的内存地址不可改变,并不是const的值不可改变
const a={}a.name='xxx'a.age='21' //可以运行const b=[]b.push('xxx')//可以运行复制代码
取消这一特性,可以通过const c=Obeject.freeze({})来实现
2.块作用域,暂时性死区
这点与let相同
3.声明时必须赋值
const a //报错复制代码
const声明时必须赋值,否则报错
函数提升
函数的提升只对声明式函数有效,对字面量函数无效
console.log(f1()) // 10; function f1(){ return 10; } //函数提升console.log(f1()) // 10;
//与下面代码作用相同
var f1=function(){return 10;}
console.log(f1()) //
console.log(f1()) //
复制代码
函数提升的优先级要高于变量提升,也就是函数会被优先放在顶部,而后才是变量
console.log(a); //function (){return}
var a = 100;
function a(){
return 10;
}
console.log(a); // 100;复制代码
为什么需要块作用域
1. 内层变量可能会覆盖外层变量
2. 计数循环的变量泄露成全局变量