明天有工夫又看了一下 es6 的语法, 略微做了一点总结, 便于日后查阅:
let / const 申明变量, 一下所讲的所有的特点都是相较于 var 来说的
var:
1: 变量晋升: var/function 申明的变量会被晋升到它的调用之前
console.log(aa); //undefined
var aa;
== 等价于 ==
var aa;
console.log(aa); //undefined
aa = 12;
console.log(aa); //12
2: 全局作用域 / 函数作用域
函数外部能够拜访全局作用域的变量, 大那是全局作用域只能够拜访全局变量,
let 特点:
1 . 不存在变量的晋升
console.log(bb); // 报错
let bb;
2 . 暂时性死区
在一个块级作用域内申明的变量就会绑定在这个区域内了, 在 let 没有申明变量之前这个变量都是不可用的
1) : console.log(aa); // 报错
let aa;
2) : function fn(aa){let aa;}
fn();// 报错,aa 曾经申明过了, 这也阐明了函数的参数实是在这个函数外部申明一个变量
3) : function bar(x = y, y = 2) {return [x, y];
}
bar(); // 报错 在赋值 x = y 的时候,y 还没有被申明.
//function bar(x = 2, y = x) {// return [x, y];
//} 这样是可行的
3 . 不容许反复申明; 在同一个块作用域 ("{}" ) 内不能够反复申明同一个变量
1) : let aa = 1;
let aa;
console.log(aa); // 报错, aa 曾经申明
2) : function fn(bb){let bb;}
fn();// 报错 ,bb 曾经申明
4 . 块级作用域
会计作用域外部能够拜访蕴含它的组用域内的变量, 然而却不能拜访蕴含于它的块级作用域的变量
let tmp = "hello";
//console.log(aa); // 找不到 aa
//console.log(bb); // 找不到 bb
function f() {console.log(tmp); //hello
//console.log(bb); // 找不到 bb
let aa = 123;
if (true) {
let bb = 567;
console.log(tmp); //hello
console.log(aa); //123
}
}
f();
const 特点:
根本以 let 是统一的, 只有一点 const 申明的变量是只读的, 一但申明就必须初始化(赋值), 边切前面也不能够在从新赋值