let 命令
注:ES6新增的声明变量的命令,用法同 var。
- 所声明的变量只在它所在的代码块内(大括号内)有效。
// 正确
{
let name = "小明";
console.log("name:" + name); // name:小明
}
// 错误
{
let name = "小明";
}
console.log("name:" + name); // ReferenceError
- 不存在变量提升,即变量必须在声明后方可使用,否则会报错。
console.log("name:" + name); // ReferenceError
let name = "小明";
// var 存在变量提升,即变量在未声明前使用,值为undefined
console.log("name:" + name); // name:undefined
var name = "小明";
- 暂时性死区,即代码块内所声明的变量在声明之前不可用。
// 情况1
{
name = "小明";
console.log("name:" + name);
// 以上属于暂时性死区
let name = "西西";
console.log("name:" + name);
}
// 情况2(隐蔽性),参数 age 未声明在前
function info(luckyNumber = age, age = 18) {
console.log("luckyNumber:" + luckyNumber);
}
info();
// 情况3(赋值方的变量未声明,即等号右边 name 未声明)
{
let newName = name;
console.log("newName:" + newName);
}
- 同个作用域内不允许声明同个变量
// 情况1
{
let name = "西西";
let name = "小七";
console.log("name:" + name); // SyntaxError
}
// var 允许重复声明,不管是否在同个作用域下,值会被替换成最后声明的值
{
var name = "西西";
var name = "小七";
console.log("name:" + name); // name:小七
}
var name = "西西";
{
var name = "小七";
}
console.log("name:" + name); // name:小七
// 情况2
{
let name = "西西";
var name = "小七";
console.log("name:" + name); // SyntaxError
}
// 情况3(参数命名与变量名重复)
function info(name) {
let name = ""; // SyntaxError
}
info();
块级作用域
- 外层作用域无法读取内层作用域的变量;相反,内层作用域则可以读取到外层作用域的变量
// 外-->内
function info(bool) {
if (bool) {
let age = 18;
}
console.log(age); // ReferenceError
}
info(true);
// 内-->外
function info(bool) {
let name = '西西';
if (bool) {
let age = 18;
console.log(age); // 18
console.log(name); // 西西
}
}
info(true);
- 内层作用域可定义与外层作用域同名的变量
function info(bool) {
let age = 10;
if (bool) {
let age = 18;
console.log(age); // 18
}
console.log(age); // 10
}
info(true); // 输出顺序18、10
- 可任意嵌套
{
{
{
console.log('hello!');
}
}
}