JavaScript,作用域链和模拟块级作用域(笔记二)

骑猪看日落 2022-05-23 11:45 257阅读 0赞
  1. JavaScript的作用域,让我大吃一斤,没看到还不知道,竟然还有这些注意的地方。

1、对JavaScript作用域的不了解

  1. 对很多人应该来说,这个不是问题,但刚刚学习JavaScript的人来说,这应该算是一个细节的忽略。

直接上代码:

70

  1. 对于之前学习其他语言的人来说,\*\*\*竟然还有这种情况

70 1

  1. 图为java代码
  2. 由上就可以看出,在JavaScript中是没有块级作用域的。那么JavaScript不是无法无天了吗。

2、JavaScript的作用域环境和作用域链

  1. 本人对JavaScript的理解,就作用域环境而言,个人认为它就是相当于块级作用域,不过它只包含两个方面:全局环境和函数环境。
  2. 所以可以简单的理解成,JavaScript就函数的花括号\{ \}有用。
  3. 在确认环境的范围后,就可以去理解作用域链的关系。(这里就简单的笔记,详细看《高程3》)
  4. 作用域链,个人理解,就是在JavaScript中每次运行代码时,都会有一个环境。
  5. ![70 2][]
  6. 在这个简单的代码中就,是在一个环境中执行,而这个环境就是全局环境(在window中就是window
  7. 这是就会产生一条作用域链,这条作用域的前端在window中就是window对象。如图
  8. ![70 3][]
  9. 椭圆形用来代表环境,箭头代表作用域链。
  10. 在系统运行到函数的时候,这个时候,作用域的环境就是函数的环境,而作用域链在链接完这个环境后回去寻找,它外层的环境,直到寻找到全局环境。

70 4

  1. 这里就有一个简单的函数XXX,这时就存在两个环境。
  2. 然后我们运行XXX函数。
  3. 注:这里说一个应该基础不能再基础的问题,function是定义函数,不运行函数时(给像我一样的菜鸟),所以我们调用函数
  4. ![70 5][]
  5. 或直接运行
  6. ![70 6][]
  7. 这个时候的作用域链就是:

70 7

  1. arguments\[ \]数组是function的参数(这里就要说到,在JavaScript中函数参数的接受与参数的定义无关,函数有一个自带的数组接收参数,关于函数参数下次笔记里全面的回顾一下,写一下)。
  2. 所以在JavaScript执行时当前的环境,需要的识别符(如i,j)回先去当前环境寻找,有没有定义,有的话停止寻找,没有的话接着到下一个环境去寻找直到全局环境,如果都没找到就报错。

3、模拟块级作用域

在ECMAScript 6(简称ES6)中新增了一个“let”使js有了与块级作用域一样的功能。

在没有块级作用域时:

  1. ![70 8][]
  2. i本来应该在for循环里才比较合适,现在它循环好后就直接出来了。
  3. 如果这个时候用let代替
  4. ![70 9][]
  5. 就会被报错。

4、一种不推荐的注意点

  1. JavaScript是一种灵活的语言,在定义一下类型的时候,一定要注意。
  2. JavaScript

70 10

  1. 由于函数作用域环境的影响,在全局环境中的“i”是找不到定义的,所以报错。但是如果你去掉var的话

70 11

  1. 现在应该大致知道了,去掉vari就变成了全局变量。(但这里不推荐这样用!)

发表评论

表情:
评论列表 (有 0 条评论,257人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JavaScript没有作用

    有些知识,不经常去碰,就会遗忘,在学习的过程中,经常做笔记,没事的时候回头看看也是种享受. JavaScript没有块级作用域经常会造成理解上的困惑。在其他语言中,由花括号封

    相关 Javascript作用

    Javascript没有块级作用域的概念。这意味着在块级语句中定义的变量,实际上是在包含函数中而非语句中创建的。 eg: function outputNumbe