变量
定义
变量的定义使用关键字var
、let
、const
变量名使用小驼峰命名 ( camelCase )
js
var 变量名 = 值;
let 变量名 = 值;
const 常量名 = 值;
var 不推荐 | let | const | |
---|---|---|---|
重复声明 | 允许 | 不允许 | 不允许 |
变量提升 | 允许,初始化为 undefined | 允许,但不能访问 ( 处于暂时死区 ) | 允许,但不能访问 ( 处于暂时死区 ) |
重新赋值 | 允许 | 允许 | 不允许 |
初始值 | 允许定义时不赋值 | 允许定义时不赋值 | 定义时必须赋值 |
循环遍历 | 变量会泄漏到外部作用域 | 每次迭代会创建新作用域 | 每次迭代会创建新作用域 |
解构赋值
js
let [字符1位置的变量, 字符1位置的变量] = 字符串;
let [元素1位置的变量, 元素2位置的变量] = 数组;
let { 键1同名变量, 键2同名变量: 自定义别名 } = 键值对对象;
例子: 对字符串、数组、键值对进行解构赋值
js
let [a, b, c, d] = "12";
console.log(a, b, c, d); // "1" "2" undefined undefined
js
let [a, b, c, d] = [1, 2];
console.log(a, b, c, d); // 1 2 undefined undefined
js
let obj = { x: 1, y: 2 };
let { a, b } = obj;
console.log(a, b); // undefined undefined
let { x, y } = obj;
console.log(x, y); // 1 2
let { x: xx, y: yy } = obj;
console.log(xx, yy); // 1 2
变量作用域
Scope
作用域是指变量的可访问范围,变量根据其在定义时所处位置决定其所属的作用域
访问与修改变量时会按照作用域链 ( Scope Chain ) 从当前作用域向上查找直至全局作用域
js
let num = 1; // 属于全局作用域
function a() {
let num = 2, xxx = 'xxx'; // 属于函数作用域 a
(function b() {
let num = 3, yyy = 'yyy'; // 属于函数作用域 b
(function c() {
let num = 4; // 属于函数作用域 c
console.log(num, xxx, yyy); // ↑ 向上查找最近一级作用域内的变量
})();
})();
}
a(); // 4 "xxx" "yyy"
全局作用域
Global Scope
全局作用域范围是在函数外部的整个程序中
定义在全局作用域中的变量可在程序任意位置被访问使用
函数作用域
Function Scope
函数作用域也被称为局部作用域、私有作用域,其范围是在某个函数的内部
定义在函数作用域中的变量只能在该函数内被访问使用,函数执行结束后会被自动销毁
若想在外部访问使用需要借助 闭包函数
块级作用域
Block Scope
块级作用域范围是在大括号{ }
包裹的代码块内部 ( 函数体、条件语句、循环语句等 )
定义在块级作用域中的变量只能在该函数内被访问使用,代码块执行结束后该变量被自动销毁
块级作用域仅适用于通过关键字let
、const
定义到代码块内部的变量、常量
例子:利用块级作用域实现在循环语句代码块中确保每次迭代都会获取新的变量
js
for (var i = 1; i <= 4; i++) {
setTimeout(function () {
console.log(i);
}, 0);
}
// 5
// 5
// 5
// 5
for (let i = 1; i <= 4; i++) {
setTimeout(function () {
console.log(i);
}, 0);
}
// 1
// 2
// 3
// 4