0. 目标
- 能够说出JS的两种作用域
- 能够区分全局变量和局部变量
- 能够说出如何在作用域链中查找变量的值
1. 作用域
1.1 作用域的定义
代码名字(变量)在某个范围内起作用和效果 目的是为了提高程序的可靠性更重要的是减少命名冲突
1.2 JS的作用域(ES5)
全局作用域 : 在整个script标签或者是一个单独的JS文件中起作用
var num = 10; // 全局作用域
局部作用域(函数作用域) : 只在函数内部起作用和效果
function fn(a){
// 局部作用域
var num = 20;
}
2. 变量的作用域
2.1 全局变量和局部变量
全局作用域下的变量为全局变量,在整个作用域下都可以使用
注意:如果在函数内部没有声明,直接赋值的变量为全局变量
局部作用域下(函数内部)的变量,就是局部变量,只能在函数内部使用
注意:函数的形参也可以看作是局部变量
- 全局变量 和 局部变量 的区别
- 起作用的区域不同
- 全局变量在浏览器关闭时才会被销毁,比较占内存。局部变量在代码块运行结束后,就会被销毁,更节约空间。
var num = 10;
function fun(){
console.log(num); // 10
num2 = 20; // 全局变量
}
fun();
2.2 ES5中JS没有块级作用域
{} 中包裹的内容为块级作用域 if(){} for(){}之中的变量都是全局变量
3. 作用域链
只要是代码,至少有一个作用域
函数内部的是局部作用域
函数中还有函数,就会诞生一个新的局部作用域
根据内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链 就近原则
输出 20
输出 num 为 123