let,const和var的详解
用let声明变量,它的用法类似var,但是let所声明的变量,只在所在的代码块内有效,即花括号{}(有些私有意思)
{
let a = 10
var b = 1
}
console.log(a) //Uncaught ReferenceError: a is not defined
console.log(b) //1
let const 不存在变量提升,规范代码(必须先声明变量后使用,否则会报错)
console.log(foo); // 输出undefined
var foo = 2;
console.log(bar); // 报错ReferenceError
let bar = 2;
ES6 明确规定,如果块级作用域中存在let和const命令,这个区域对这些命令声明的变量,从一开始就形成了封闭作用域,不再受外部得影响。凡是在声明之前就使用这些变量,就会报错(暂时性死区)
//只要块级作用域内***存在***let命令,它所声明的变量就绑定这个区域,不再受外部影响
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
//暂时性死区演示(temporal dead zone,简称 TDZ)
if (true) {
// TDZ开始
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ结束
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
let,const不允许在相同作用域内重复声明同一个变量,也不能在函数内部重新声明参数
// 报错
function func() {
let a = 10;
var a = 1;
}
function func(arg) {
let arg;
}
func() // 报错
es5只有全局作用域和函数作用域,es6新增的let,const为JavaScript 新增了块级作用域,在块级作用域内定义的变量不会污染到块级作用域外
//外层代码不受内层代码的影响,注意:都是n这个变量名称
function f1() {
let n = 5;
if (true) {
let n = 10;
}
console.log(n); // 5
}
const声明一个只读的常量。一旦声明,常量的值就不能改变
const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。
//只声明不赋值,就会报错。
const foo; // SyntaxError: Missing initializer in const declaration

浙公网安备 33010602011771号