目录

🔭 JavaScript 作用域

作用域表示 JavaScript 变量的作用范围。

# 局部作用域

变量在函数内声明,变量为局部作用域。

局部变量:只能在函数内部访问。

// 此处不能调用 carName 变量
function myFunction() {
    var carName = "Volvo";
    // 函数内可调用 carName 变量
}
1
2
3
4
5
  • 局部变量在函数开始执行时创建,函数执行完后局部变量会自动销毁。
  • 因为局部变量只作用于函数内,所以不同的函数可以使用相同名称的变量。

​ 当在函数作用域中使用一个变量时,它会先在自身作用域中寻找,如果找到了则直接使用,如果没有找到则到上一级作用域中寻找,如果找到了则使用,找不到则继续向上找,一直会;

# 全局作用域

变量在函数外定义,即为全局变量

全局变量有 全局作用域: 网页中所有脚本和函数均可使用。

var carName = " Volvo";
 
// 此处可调用 carName 变量
function myFunction() {
    // 函数内可调用 carName 变量
}
1
2
3
4
5
6

若在函数内没有使用 var 声明,也为全局变量:

// 此处可调用 carName 变量
 
function myFunction() {
    carName = "Volvo";
    // 此处可调用 carName 变量
}
1
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

# 作用域链

根据内部可以访问外部函数变量的机制,用链式查找决定哪些变量能被内部函数访问 —— 作用域链;

var num = 10;

function fn(){
    var num = 20;
    function fun(){
        console.log(num); // 就近原则为:往上一级查找num变量
    }
    fun();
}
1
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

只有声明的变量会被提升,初始化的不会!

var x = 5; // 初始化 x
var y = 7; // 初始化 y

elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y;           // 显示 x 和 y
1
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

为了避免出现变量未定义的问题,通常我们在每个作用域开始前声明这些变量,这也是正常的 JavaScript 解析步骤,易于我们理解。

JavaScript 严格模式 (strict mode) 不允许使用未声明的变量。

📢 上次更新: 2022/09/02, 10:18:16