ES6变量定义
1.Let关键字
Let是ES6的新增关键字,用来声明变量,它的用法和 var 的用法类似,但是let只在自己所在的代码区域内有效.
- 例:
//var
var a = [];
for(var i = 0;i < 10 ;i++){
a[i] = function(){
console.log(i);
}
}
a[6](); // 结果为10
var 定义的变量遇到for循环的大括号后是不会行程作用域的.所以在上面代码调用时,调用的是一个全局的变量.
//let
var a = [];
for(let i = 0;i < 10 ;i++){
a[i] = function(){
console.log(i);
}
}
a[6](); // 结果为6
以上代码中,i是使用 let
声明的,当前的 i 只在本轮的循环中有效.每一个循环中放入 i
其实都是一个新的变量.所以输出是6
for (let i = 0; i < 3; i++) {
let i = "abc";
console.log(i);
}
//结果:输出3次abc
//原因:在代码块中的变量 i 与 for 循环中的变量 i 不再同一个作用域中;
1.1 let不存在变量提升
var 存在变量提升.即变量在声明之前使用时,值为undefined , js会将声明语句放在所有js代码之前执行则 let则不存在变量提升.
console.log(a);
var a = 10;
//相等于
var a;
console.log(a);
a = 10;
console.log(a);
let a = 10;
// 提示错误Cannot access 'a' before initialization
1.2不允许重复声明
- let 不允许在相同的作用域中,重复声明同一个变量
let a = "hello";
let a = "world";
console.log(a);
//报错: Identifier 'a' has already been declared
function show(a){
let a = 10;
}
show(100);
//Identifier 'a' has already been declared
以上代码中,函数的参数 a
与函数内部的 a
作用域相等,所以会报错。
function show(a){
{
let a = 10;
}
}
show(100);
1.3 暂时性死区
var tmp = 123;
if(true){
tmp = "abc";
let tmp;
console.log(tmp);
}
结果:提示错误 Cannot access 'a' before initialization
使用变量时,会先寻找同一作用域下的变量。以上代码中,tmp=abc
会优先寻找到下面的let tmp
而let tmp
不存在变量提升,所以提示错误。
总结:在代码块中,使用 let
命令声明变量之前,该变量都是不可用状态,在语法上,称为“暂时性死区”
2.块级作用域
2.1为什么需要块级作用域
ES5 只有全局作用域和局部作用域(函数作用域),没有块级作用域。
- 缺点1:内部变量可能覆盖外层的变量
var date = new Date();
function f(){
console.log(date);
if(false){
var date