面试题:作用域
2019-12-26
作用域:变量的一个作用范围
结果为:12、15、15。
过程:首先代码按照执行顺序从上往下执行。 注意:代码都是先从window(全局作用域:也就是整个浏览器 分为存储空间和执行空间(body))
1.先通过关键字把关键字声明的变量存到存储空间。这里:将变量a通过关键字var声明 存储到存储空间、将function函数声明的函数变量也存到存储空间
function在存储空间是以字符串的形式存放的、会在存储空间有一个单独的空间(堆空间:用来存函数(私有)变量、数组等)
2.执行12行 ,fn()是一个作用域 它会重新创建一个私有空间(局部作用域)在这个私有空间重新按照顺序开始寻找关键字,然后执行语句(代码)
这里:从14行开始 因为没有关键字声明的变量 存储空间内也就什么都没有 然后开始执行代码 14行的控制台输出的是12,因为私有空间的存储空间内并没有变量a
它会向上一级查找,这里找到全局作用域发现它的存储空间有变量a,有就拿来使用,所以这里14行的控制台输出的是12.
14行执行完之后 开始执行第15行发现这个a=15并未被声明 那么它也就不会被存到私有空间的存储空间中,单纯的a=15控制台输出的话值为undefined 是因为它在执行的过程中
会被当做一个浏览器的属性 挂在浏览器中 那么这里的a=15并不在私有空间的存储空间中,而是跑到了window全局作用域中 充当window的一个属性并且把全局作用域中的a=12更新为15
然后执行第16行 控制台输出的值为15,因为a=12已经被更新(替换了)所以第二个值(第16行的控制台输出的值是15)
16行执行完了(也就是)fn();第12行执行完毕 然后开始执行第18行的控制台输出 15 因为在fn这个作用域中window中声明的变量值已经被更换了
下面看一下图: