var a = 10;
function text() {
var a = 20;
console.log(a);
}
text();
let a = 10; //先定义一个变量a
let a = 50; //再定义变量a时不能重复 未捕获的语法错误:已声明标识符“a”
console.log(a) //输出会报错
function text() {
let a = 20; //这里的let只能在函数内部有用
console.log(a);
}
text(); 调用之后发现这里只会输出局部变量中的值
for (var i = 0; i < 10; i++) {
setTimeout(function() { 同步注册回调函数到 异步的 宏任务队列。
console.log(i); 执行此代码时,同步代码for循环已经执行完成
}, 0);
}
输出结果
10 共10个
i虽然在全局作用域声明,但是在for循环体局部作用域中使用的时候,变量会被固定,不受外界干扰。
for (let i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i); // i 是循环体内局部作用域,不受外界影响。
}, 0);
}
//输出结果:
//0 1 2 3 4 5 6 7 8 9
//用let声明的变量, 不存在变量提升。 而且要求必须 等let声明语句执行完之后, 变量才能使用,
//例如:
console.log(aicoder); // 错误:Uncaught ReferenceError ...
let aicoder = 'aicoder.com';
// //ES6 明确规定, 如果区块中存在let和const命令, 这个区块对这些命令声明的变量, 从一开始就形成了封闭作用域。 凡是在声明之前就使用这些变量, 就会报错。
// //总之, 在代码块内, 使用let命令声明变量之前, 该变量都是不可用的。 这在语法上, 称为“ 暂时性死区”( temporal dead zone, 简称 TDZ)。