作用域的简介
文章目录
- 一、作用域的含义
- 二、作用域的分类
- 1.全局作用域(global scope)
- 2.局部作用域(local scope)
- 3.块级作用域(block scope)
- 三、题目及总结
- 1.题目
- 2.题目总结
一、作用域的含义
指一个变量的作用范围。
二、作用域的分类
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.题目总结
变量访问原则——作用域链。
只要是代码,就至少有一个作用域。
写在函数内部的局部作用域。
如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域。
根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访 问,就称作作用域链。
作用域链:采取就近原则的方式来查找变量最终的值。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!