JavaScript作用域
定义: 简单理解就是代码(变量/函数)在某个范围内起作用和效果,作用域的目的是为了提高程序的可靠性更重要的是减少命名冲突。
js的作用域:
- 全局作用域:
-
- 任何不在函数或者大括号中声明的变量,都在全局作用域下
- 全局作用域下声明的变量可以在程序中任何位置访问
- 函数作用域:函数作用域中定义的变量,只能够在函数内部访问,不能在函数外部访问
- 块级作用域:let 和 const 定义的变量在我们的 { } 外面不能被访问到
下面我们用一些代码来看一下
<script>
//此时声明的是一个全局变量,这个变量a作用于全局。
var a = 10;
console.log(a); //输出结果是10
function demo() {
//此时声明的是一个作用于demo()这个函数的变量b。变量b的作用范围就是demo()函数的花括号内
let b = 15;
console.log(b); // 结果是10
}
console.log(b); // 注意,此时输出b就会报错,因为b只作用于函数内部
{
let c = 11; //声明了一个作用于 { } 内的变量c
const d = 22; //const也作用于 { } 内
var e = 33 //注意这里使用的是var
console.log(c, d, e);
}
console.log(c, d, e); //这里输出就会报错说c没有找到。
</script>
js作用域链
- 定义: 在我们的 js 中使用一个变量,我们的 js 引擎会在当前作用域查找,如果没有找到,就会去上一层作用域查找,以此类推,直到找到变量或者到达全局作用域。如果没有找到变量,直接报错或者隐式声明。那么这么一个寻找的路径我们就叫做作用域链。
简单举一个例子
<script>
let out = "你好!";
function demo() {
let sex = "Man";
function demo01() {
let myName = "小趴菜";
let age = 21;
console.log(myName, age);
// 在当前作用域可以找到,所以输出结果为:小趴菜, 21
console.log(sex, out);
// 当前作用域没有这个变量,会向上查找,向上查找时有这个变量,输出结果为:Man,你好!
}
demo01()
console.log(sex);
// 在当前作用域可以找到,所以输出结果为:Man
console.log(myName, age);
// 在当前作用域找不到,所以会报错
}
demo()
</script>