作用域(scope)
词条解释:一个变量的可用范围。
一个变量,并不是一定在所有的地方都能够访问到。变量可以划分为全局变量和局部变量。
全局变量:顾名思义,全局变量即在任何范围都能够访问到的变量,可以反复使用。特点:随处可见,可以反复使用。既然可以随处可见,反复使用,那么将会带来全局污染。
局部变量:只能在某一个范围内能够访问到的变量,仅在定义它的函数内部可以使用,不能够反复使用。
这里得提到函数的生命周期,关于函数的生命周期
- 在程序执行前
游览器会创建一个执行环境栈(ECS),里面会临时的保存正在执行的函数的执行空间,首先就会添加一个主方法main(),这个方法会创建出window对象,里面所存的变量也就是全局变量。比如这里的fun和a都是全局的,在任何地方都能访问到。 - 定义函数
创建了函数对象,并且封装起来,将地址赋值给了fun,而函数对象中存在一个scope属性,这个属性值指向的是创建函数时的作用域,在这里scope指向的则是window。 - 调用函数时
这个时候,在执行环境栈中就会创建一个执行空间记录执行的函数,同样会衍生出属于他的活动对象(AO),里面存放着调用fun函数需要用到的变量,比如这里的形参a,或者在函数体内var一个变量也会存在于fun的活动对象中,供fun使用。活动对象中有一个parent属性,这个属性引用的是fun函数的scope属性,指向了window,如果fun函数中用到的变量在AO中没有找到,那么将会在window中寻找。 - 调用函数后
在函数被调用执行完之后,会执行出栈,那么它将不在引用活动对象,而活动对象因为不再被任何对象引用而被垃圾回收小程序回收掉,也就是内存空间被释放掉,那么,在活动对象中存在的变量也将一同被释放掉。
为什么要说函数的生命周期呢,在最后一步中可以看到,如果函数被调用完毕,那么由它而生的变量也将一同被释放,说明这些变量的生命周期和函数的生命周期是一样的,而这些变量就是所谓的局部变量,只能在fun函数中调用到,在window中的变量则叫做全局变量。第三步可以看到,fun中用到却在fun的活动对象中找不到的,可以去window中找,这就构成了作用域链
在编程时,全局变量会造成全局污染,而作用域的优点正是为了解决这个弊端,作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突。