一.作用域
变量或者函数可以起作用的范围,变量退出作用域之后会销毁,全局变量关闭网页或浏览器才会销毁。
①全局作用域:在<script>或者一个独立的js文件中,全局作用域中定义的变量是全局变量。在任何位置都可以访问。
1 | var num = 15;//全局变量 |
2 | function fn() { |
3 | str = 'qaq';//这里不用var声明也是全局变量(不规范) |
4 | console.log(num); |
5 | console.log(str); |
6 | } |
7 | fn();//15 qaq |
8 | console.log(str);//qaq |
②局部作用域:一个函数有一个局部作用域,局部作用域中定义的变量是局部变量。局部变量只可以在定义此变量的函数里访问。
1 | function fn() { |
2 | var num = 15;//局部变量 |
3 | } |
4 | console.log(num);//num is not defined |
③块级作用域:ES5前没有,一对花括号{ }中的语句集都属于一个块。块外不能访问块内变量。
1 | { |
2 | //代码块 |
3 | var num = 15; |
4 | console.log(num);//15 |
5 | } |
6 | console.log(num);//num is not defined |
二.作用域链
函数内指向函数外的链式结构叫做作用域链。
1 | //全局作用域 --- 0级作用域链 |
2 | var num = 5; |
3 | function f1() { |
4 | //f1 局部作用域 --- 1级作用域链 |
5 | var num = 15; |
6 | function f2() { |
7 | //f2 局部作用域 --- 2级作用域链 |
8 | console.log(num); |
9 | } |
10 | f2();//步骤2:函数f1里定义局部变量num和函数f2,然后调用f2 |
11 | } |
12 | f1();//步骤1:全局作用域下定义变量num和函数f1,然后调用f1 |
13 | //步骤3:f2打印num,但是在f2里没有找到num,于是往上一级找,找到了num是15,打印。 |
14 | //如果将f1里的num等于15注释掉,那么会继续往上找,找到全局作用域的num,那么打印结果是5 |
