面试题:作用域

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中声明的变量值已经被更换了

下面看一下图:

QQ:1784841965

本文可供初学者参考,希望能够帮到大家。

posted @ 2019-12-26 18:02  火知火味  阅读(230)  评论(0编辑  收藏  举报