🔭 JavaScript 作用域
作用域表示 JavaScript 变量的作用范围。
# 局部作用域
变量在函数内声明,变量为局部作用域。
局部变量:只能在函数内部访问。
// 此处不能调用 carName 变量
function myFunction() {
var carName = "Volvo";
// 函数内可调用 carName 变量
}
1
2
3
4
5
2
3
4
5
- 局部变量在函数开始执行时创建,函数执行完后局部变量会自动销毁。
- 因为局部变量只作用于函数内,所以不同的函数可以使用相同名称的变量。
当在函数作用域中使用一个变量时,它会先在自身作用域中寻找,如果找到了则直接使用,如果没有找到则到上一级作用域中寻找,如果找到了则使用,找不到则继续向上找,一直会;
# 全局作用域
变量在函数外定义,即为全局变量。
全局变量有 全局作用域: 网页中所有脚本和函数均可使用。
var carName = " Volvo";
// 此处可调用 carName 变量
function myFunction() {
// 函数内可调用 carName 变量
}
1
2
3
4
5
6
2
3
4
5
6
若在函数内没有使用 var
声明,也为全局变量:
// 此处可调用 carName 变量
function myFunction() {
carName = "Volvo";
// 此处可调用 carName 变量
}
1
2
3
4
5
6
2
3
4
5
6
- 直接在 script 标签中编写的代码都运行在全局作用域中;
- 全局作用域在打开页面时创建,在页面关闭时销毁;
- 全局作用域中有一个全局对象 window ,window 对象由浏览器提供,可以在页面中直接使用,它代表的是整个的浏览器的窗口。
- 在全局作用域中创建的变量都会作为 window 对象的属性保存
- 在全局作用域中创建的函数都会作为 window 对象的方法保存
- 在全局作用域中创建的变量和函数可以在页面的任意位置访问。
- 尽量不要在全局中创建变量;
在 JS 中没有块级作用域;
// example
if(...){
var num = 1;
}
console.log(num); // 可以获取num
1
2
3
4
5
6
2
3
4
5
6
# 作用域链
根据内部可以访问外部函数变量的机制,用链式查找决定哪些变量能被内部函数访问 —— 作用域链;
var num = 10;
function fn(){
var num = 20;
function fun(){
console.log(num); // 就近原则为:往上一级查找num变量
}
fun();
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 声明提升
JavaScript 中,函数和变量的声明都会被提升到函数的最顶部。所以变量可以在使用后声明,先使用后声明。
x = 5; // 变量 x 设置为 5
elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x; // 在元素中显示 x
var x; // 声明 x
1
2
3
4
5
6
2
3
4
5
6
只有声明的变量会被提升,初始化的不会!
var x = 5; // 初始化 x
var y = 7; // 初始化 y
elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y; // 显示 x 和 y
1
2
3
4
5
2
3
4
5
var x = 5; // 初始化 x
elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y; // 显示 x 和 y
var y = 7; // 初始化 y
// y 输出了 undefined
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
为了避免出现变量未定义的问题,通常我们在每个作用域开始前声明这些变量,这也是正常的 JavaScript 解析步骤,易于我们理解。
JavaScript 严格模式 (strict mode) 不允许使用未声明的变量。
编辑 (opens new window)
📢 上次更新: 2022/09/02, 10:18:16