什么是作用域?什么是自由变量?
知识点:
- 作用域和自由变量
- 闭包
- This
作用域是什么?
其实它就是代表了一个变量或者说某个变量的合法的使用范围,比如说最外层的那个红框,let a=0,a可以在红框内的任何地方被使用;a1可以在第二个红框内的任何地方被使用;a2和a3同理。反例,比如说我想把a2放在红框外去使用就会报错。作用域就类似于这个红框,变量的一个合法使用范围,如果这个变量逃出这个范围去使用就会报错。
作用域分类:
-
全局作用域
代码中,直接写一个变量,这个变量没有受到任何的约束,在任何地方都可以使用,比如window对象,document对象都可以…… -
函数作用域
在函数中,可以看上图,函数作用域,变量只能在函数内使用,超过函数范围就会报错。 -
块级作用域(ES6新增)
比如说,在图中,什么叫块呢?比如说有if/for/while等后面有个大括号,大括号就叫做块。比如说我们在大括号定义了一个let x=100,如果是跑出大括号,跑出这个块去使用的话,会报错
自由变量:
- 一个变量在当前作用域没有定义,但被使用了
- 向上级作用域,一层一层依次寻找,直至找到为止
- 如果到全局作用域都没有找到,则报错xx is not defined
第一条:
- 比如说最里边的红框内,a/a1/a2
这三个都是自由变量,a3就不是,a3在当前作用域下定义为300,执行到fn3的时候呢,a没有定义,那怎么办呢?
第二条:
- 向父级作用域寻找,找到了a2 =
200,就不再找a2了,a2就等于200,再找a1,a1的时候呢,也是向上寻找,上一层没有,再上一层找到了a1 =
100,就不再找了,a1就等于100,a也是,直到找到最外层a=0,就不再找了。
第三条:
- 如果有一个变量向上找找不到的话,则未定义,则报错xx is not defined