以下内容是引用或者借鉴别人的,自己只是做个笔记,方便学习。理解错误的地方,欢迎评论。如有侵权,私聊我删除,未经允许,不准作为商业用途
let
常见错误写法
-
let
定义变量必须先声明后使用,否则报错 -
let
只在命令声明所在的代码块内有效,否则报错 -
let
命令声明所在的代码块内会形成封闭作用域,必须先声明后使用,否则报错 -
let
不允许在相同作用域内,重复声明同一个变量,否则报错
{
console.log(a) // ReferenceError: Cannot access 'a' before initialization
let a = 1;
var a = 1; // SyntaxError: Identifier 'a' has already been declared
console.log(a) // 1
}
console.log(a) // ReferenceError: a is not defined.
var a = 1
{
a = 2 //ReferenceError: Cannot access 'a' before initialization
let a = 3
}
function func(a) {
let a; // 同作用域下已经被声明为形参
}
func() // SyntaxError: Identifier 'a' has already been declared
for循环特别之处,设置循环变量的是一个父作用域,而循环体内部是一个单独的子作用域。循环变量i与函数内部的变量i不在同一个作用域,有各自单独的作用域
for (let i = 0; i < 3; i++) {
console.log(i); //父作用域值
}
// 0
// 1
// 2
for (let i = 0; i < 3; i++) {
let i = 5;
console.log(i); //子作用域值
}
// 5
// 5
// 5
块级作用域{}
,每个块都有单独的作用域
// IIFE 写法
(function () {
var tmp = ...;
...
}());
// 块级作用域写法
{
let tmp = ...;
...
}
// 块级作用域内部的函数声明语句,建议不要使用
{
let a = 'secret';
function f() {
return a;
}
}
// 块级作用域内部,优先使用函数表达式
{
let a = 'secret';
let f = function () {
return a;
};
}
const
用法与上面讲解的let
基本一致,除了以下这点
- 声明一个只读的常量,且声明时,必须立即赋值,并且不能再改变(内存地址,因为再赋值时会创建新地址)
const a // SyntaxError: Missing initializer in const declaration
const b = 1
b = 2 // TypeError: Assignment to constant variable
const a = {}
a.c = 1 //不会报错,因为地址没有变
a = {} //TypeError: Assignment to constant variable.
网友评论