JavaScript高级程序设计学习笔记(1)
1.变量
ECMAScript变量是松散类型的,意思是变量可以用于保存任何类型的数据。每个变量只不过是一 个用于保存任意值的命名占位符。
JavaScript有 3 个关键字可以声明变量:var、const 和 let。其中,var 在 ECMAScript 的所有版本中都可以使用,而 const 和 let 只能在 ECMAScript 6 及更晚的版本中使用
1.1 var 关键字
要定义变量,可以使用 var 操作符(注意 var 是一个关键字),后跟变量名。
var message; // 还未初始化会保存一个undefined的特殊值,
上述代码定义了一个message的变量,可以保存任何类型的值,并且还没有初始化。let 初始化保存的变量,不仅可以改变保存的值,也可以改变值的类型。
1.1.1 var 的作用域
使用 var 操作符定义的变量会成为包含它的函数的局部变量。例如,使用 var在一个函数内部定义一个变量,就意味着该变量将在函数退出时被销毁。
function test() { var message = "hi"; // 局部变量 } test(); console.log(message); // 出错!
1.1.2 var声明提升
“提升”(hoist),也就是把所有变量声明都拉到函数作用域的顶部
1.2 let 声明
let 声明的范围是块作用域, 而 var 声明的范围是函数作用域。
块作用域 是函数作用域的子集,因此适用于 var 的作用域限制同样也适用于 let。
let 也不允许同一个块作用域中出现冗余声明。
var name; let name; // SyntaxError let age; var age; // SyntaxError
1.2.1 暂时性死区
let 与 var 的另一个重要的区别,就是 let 声明的变量不会在作用域中被提升。
name // 会被提升 console.log(name); // undefined var name = 'Matt'; // age 不会被提升 console.log(age); // ReferenceError:age 没有定义 let age = 26;
在解析代码时,JavaScript 引擎也会注意出现在块后面的 let 声明,只不过在此之前不能以任何方 式来引用未声明的变量。在 let 声明之前的执行瞬间被称为“暂时性死区”(temporal dead zone),在此 阶段引用任何后面才声明的变量都会抛出 ReferenceError。
1.2.2 全局声明
与 var 关键字不同,使用 let 在全局作用域中声明的变量不会成为 window 对象的属性(var 声 明的变量则会)。
var name = 'Matt'; console.log(window.name); // 'Matt' let age = 26; console.log(window.age); // undefined
不过,let 声明仍然是在全局作用域中发生的,相应变量会在页面的生命周期内存续。因此,为了 避免 SyntaxError,必须确保页面不会重复声明同一个变量。
1.3 const 声明
const 的行为与 let 基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且 尝试修改 const 声明的变量会导致运行时错误。
const 也不允许重复声明。
const 声明的作用域也是块。
1.4 let, const, var 的区别
let 声明的范围是块作用域,而 var 声明的范围是函数作用域
let和const,var 的区别:
(1)块级作用域不一样:
块级作用域有{ }包括,let和const 是有块级作用域,var不存在块级作用域
(2)变量提升:(函数及变量的声明都将被提升到函数的最顶部)
var 存在变量提升,let和const不存在变量提升,即变量只能在声明之后使用,否则会报错
(3)重复声明:var声明变量时可以重复声明,后声明的同名变量会覆盖之前声明的变量。
let和const不能重复声明
(4)暂时性死区:在使用let和const命令声明之前该变量都是不可用的,这称为暂时性死区。使用var声明不存在暂时性死区。
(5)初始值设置:用let和var声明变量时可以不设置初始值,使用const声明变量时必须设置初始值,不然会报错
(6)指针指向:let创建的变量是可以更改指针的指向的(可以重新赋值)。但const声明的变量是不允许改变指针的指向
区别
|
是否有块级作用域
|
是否存在变量提升
|
是否添加全局属性
|
能否重复声明变量
|
是否存在暂时性死区
|
是否必须设置初始值
|
能否改变指针指向
|
var
|
×
|
✔️
|
✔️
|
✔️
|
×
|
×
|
✔️
|
let
|
✔️
|
×
|
×
|
×
|
✔️
|
×
|
✔️
|
const
|
✔️
|
×
|
×
|
×
|
✔️
|
✔️
|
×
|
使用:
变量命名推荐顺序: const > let > var
行为怪异的 var 所造成的各种问题
- 限制自己只使用 let 和 const 有助于提升代码质量,因为变量有了明确的作用域、声明位置,以及不变的值