2.1.1 基本用法
1:let声明的变量只在所在的代码块内有效;
2:var解析
if(true){
var a=10
}
console.log(a) 、、10
for (var i = 0; i < 3; i++) {
setTimeout(function () {
console.log(i); //3个3
}, 0);
}
3:
4:
5:var的作用域还是跟以前一样,只不过for循环比较特殊;
2.1.2 let命令不存在变量提升
2.1.3 暂时性死区
ES6明确规定,如果区块中存在let和const命令,则这个区块对这些命令声明的变量从一开始就形成封闭的作用域;只要在声明之前使用这些变量,就会报错;
暂时性死区的本质就是:只要进入当前作用域,所要使用的变量就已经存在,但是不可以获取,只有等到声明变量的那行代码出现以后,才可以获取、使用这些变量;
2.1.4 不允许重复声明
//以下三种方式全部报错 Uncaught SyntaxError: Identifier 'a' has already been declared
function run1(){
var a=10;
let a=20;
}
function run2(){
let a=10;
var a=20;
}
function run3(arg){
let arg=20
}
//这种方式是正确的
function run4(arg){
{
let arg=20
}
}
console.log('6666')
//err:Identifier 'y' has already been declared;虽然不进行预解释,但是代码执行前也是先将定义的变量提前过滤一遍,一旦发现不合法的值就直接报错;代码也不会执行;所以6666也不会打印
console.log(y);
let y=10
let y=30
let 声明的变量不会给全局当做属性
//let 声明的变量不会给全局当做属性
let b=1;
console.log(window.b); //undefined
块级作用域
//for(){},if(){},{}