一、作用域
概念:作用域是在程序运行时代码中的某些特定部分中变量、函数和对象的可访问性。
分类: 在JavaScript中,作用域分为全局作用域和函数作用域(局部作用域)。
函数作用域:在固定的代码片段才能被访问
例如:
<script>
let a = 10,
b = 20;
function fn() {
let c = 111,
d = 222;
console.log(c, d);
function fn2() {
let a = 1111,
d = 2222;
console.log(a, d);
}
fn2();
}
console.log(a, b);
fn();
</script>
作用域有上下级关系,上下级关系的确定就看函数是在哪个作用域下创建的。
作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。
总结:作用域就是代码的执行环境,全局作用域就是全局执行环境,函数作用域就是函数的执行环境,它们都是栈内存
二、作用域链
概念:多个作用域对象连续引用形成的链式结构。
一般情况下,变量取值到 创建 这个变量 的函数的作用域中取值。但是如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链。
例如:
<script>
let a = 10,
b = 100;
function fn() {
let b = 20;
function fn2() {
console.log(a + b);
/*fn2函数局部作用域中没有变量a,于是从它的上一级,也就是fn函数中查找,发现fn也没有
然后在上一次 全局作用域中a呗赋值为10,于是输出的是10
而变量b呢在fn2中没有,于是找到它的上一级 fn fn函数中b被赋值为20,于是输出20
故而 a+b = 10+20
*/
}
fn2();
}
fn();
</script>