文章目录
一、作用域的含义
指一个变量的作用范围。
二、作用域的分类
1.全局作用域(global scope)
直接编写在 script 标签中的 js 代码,都会在全局作用域中。全局作用域会在页面打开时创建,在页面关闭时销毁。
let a = 18;
function fun() {
let a = 20;
}
fun();
console.log(a); // 输出 18
注意:全局作用域的变量都是全局变量,在页面中的任意地方都可以访问和修改。
2.局部作用域(local scope)
局部作用域也称为函数作用域。调用函数时创建函数作用域,函数执行完毕后,函数作用域销毁。
每调用一次函数就会创建一个新的函数作用域,它们之间是相互独立的。在函数作用域中可以访问到全局作用域中的变量;在全局作用域中无法访问到函数作用域的变量。
当在函数作用域中操作一个变量时,它会先在自身的作用域中去找,若有则直接使用;若没有则向上一级作用域中寻找。直接找到全局作用域,若全局作用域仍未找到,则直接报错:Reference Error
注意:局部作用域的变量时局部变量,只能在变量所在的局部作用域中进行访问和修改。
// 情况1:当在函数作用域中操作一个变量时,它会先在自身的作用域中去找,若有则直接使用;
let a = 18;
function fun() {
let a = 20; console.log(a);
}
fun(); // 输出 20
//情况2: 直接找到全局作用域
let a = 18;
function fun() {
console.log(a);
}
fun(); // 输出 18
// 情况3:若全局作用域仍未找到,则直接报错:Reference Error
function fun() {
console.log(a);
}
fun(); // 报错 Uncaught ReferenceError: a is not defined
注意1: 在函数内部没有声明直接赋值的变量也属于全局变量。但是不推荐这种方式声明全局变量
let a = 18;
function fun() {
b = 20;
}
fun();
console.log(b); // 输出为 20
注意2:函数内部的形参可以看做是局部变量。
function fun(a) {
a = 18; // 相当于let a = 18;
console.log(a);
}
fun(); // 输出18
3.块级作用域(block scope)
在 {} 之间定义的 js 代码是块级作用域。
注意:在块级作用域里定义的变量是块级变量,只在该块级作用域中有效。
// 求0-10的和
let sum = 0;
for (let i = 1; i <= 10; i ++) { // i 是块级变量
sum += i;
}
document.write(sum);
三、题目及总结
1.题目
function fun1() {
let num = 123;
function fun2() {
let num = 0;
console.log(num);
}
fun2();
}
let num = 456;
fun1(); // 输出 0
let a = 1;
function fun1() {
let a = 2;
let b = '22';
fun2();
function fun2() {
let a = 3;
fun3();
function fun3() {
let a = 4;
console.log(a); // 输出 4
console.log(b); // 输出 22
}
}
}
fun1();
2.题目总结
变量访问原则——作用域链。
只要是代码,就至少有一个作用域。
写在函数内部的局部作用域。
如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域。
根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访 问,就称作作用域链。
作用域链:采取就近原则的方式来查找变量最终的值。