对每一个初学js的小伙伴来说,执行环境和作用域都是比较难理解的,而要真正理解这些复杂的概念,就必须不断去看,不断去实践,从中发现和总结其中的规律。
首先,我先讲一下执行环境。要理解执行环境,需要理解js引擎中关于变量的声明和提升。在js引擎中,变量分为全局变量、局部变量和私有变量。其中全局
变量就是在全局中定义的变量,即是在一开始和函数外定义的。局部变量是在函数内部定义的变量。私有变量从一定程度上讲其实就是局部变量,私有变量包括函数
的参数、局部变量和在函数内部定义的其他函数。由于js(除了ES6外)只有函数作用域,没有块级作用域,所以在函数外没有权限访问得到私有变量。理解了变量的
声明和分类之后,下面我们来了解一下变量的提升。js中的变量在引用前需要经过三个步骤,分别是变量的声明、提升、初始化。而在js引擎中,变量的提升就是在声
明变量后先把变量名提升到全局作用域前面或者函数内部的顶部。在提升完变量后,接着就是变量的初始化,即是变量的赋值。
有了变量的相关概念之后,下面我们来讲执行环境。执行环境是js引擎中的一种概念,是运行中的函数的意思,它不是对象,要区别于执行环境对象(执行环境
对象是指js引擎中把变量作为属性保存在一个对象中,这个对象就叫执行环境对象)。而执行环境是在函数执行时产生的,所有在函数中定义的变量和函数都是执行
环境中的一部分。如果在一个函数中还有函数(即是闭包),那么在父函数执行时就会先产生一个执行环境(这里称为父执行环境),当执行到父函数内部的子函
数A时又会产生一个执行环境(这里称为子执行环境A),假如父函数里面还有一个子函数B,那么当子函数A执行完后,又会执行子函数B,又会产生一个子执行
环境(这里称为子执行环境B)。子执行环境可以访问到父执行环境里面的变量,要注意此时一定要求这个子执行环境在它的父执行环境中,如果在别的父执行环
境或者全局执行环境是访问不到的。而兄弟执行环境(这里指执行环境A和执行环境B)相互之间是不能访问得到变量的。到此,执行环境就讲完了,不知道你有
没有理解呢,可能概念会有点绕,但是只要把握住执行环境就是函数范围就可以了,利用范围概念去理解,不在这个范围内就访问不到。
接下来,我们就要讲作用域了。其实前面对作用域也讲了一部分。讲作用域之前,我们需要理解一个概念,作用域就是一条作用链,沿着这条链去访问变
量。作用域分为全局作用域和局部作用域。全局作用域的级别比局部作用域的高,在访问变量时,先是访问局部作用域,如果局部作用域找不到,再去找全局作用
域。作用域也是可以嵌套的。局部作用域广义上就是函数作用域,因为js没有块级作用域。
到此,我就讲完了js的执行环境和作用域,希望对你有一定的帮助,可以让你更加理解js的内层。