请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

作用域与执行环境的关系

不知道有没有钻牛角尖,请老师批评指正。

我理解作用域:其实作用域就是有个抽象的概念,他表示一块区域。这个区域规定了有哪些变量和函数可以被访问到。

我理解的作用域链:作用域链就是当函数发生嵌套时(包括函数定义时的嵌套,以及递归),外层函数的的作用域包括了内层函数的作用域。从内往外看,就构成了类似一个作用域连着一个作用域的链,所以就构成了作用域链。当前作用域内找不到的标识符,就外层作用域寻找,但是不能向内寻找。找不到,就报错。

那么根据作用域嵌套的方式:作用域链可以分成静态作用域和动态作用域。
函数定义发生嵌套时所构成的作用域链就是静态作用域链。这个作用域链是函数定义时就已经确定,并不会改变链的长度。例如下面这段代码的作用域链:

 let a = 1
 function fn1(){

     function fn2(){
        
     }

 }

上述代码的作用域链为:
图片描述

当发生递归的时候构成的作用域链就是一个动态作用域链。随着递归层数的增加,作用域链的最内层一直都是那个新递归调用的那个函数的作用域。当一层递归结束,作用域链的头部就指向上一层的递归函数的作用域。所以发生递归调用时,构成的作用域链是动态的,长度是在发生改变的。例如下面这段代码的作用域链为:
图片描述

我理解的执行上下文: 根据红包书的说法,每一个函数都有自己的执行环境,那么这个执行环境这个执行环境有一个与之对应的变量对象,这个变量对象中保存着当前执行环境中的所定义的变量(说标识符也可以)。

问题1:
那么由于作用域规定在当前这个范围内有权访问的变量和函数,而函数的执行环境所对应的变量对象正是保存这当前这个范围内定义的变量和函数,那么请问我是不是可以这么理解:一个函数有自己的作用域,而函数又有自己的执行环境,这个执行环境的变量对象保存着在这个函数中定义的变量和函数。那么将某个函数的函数作用域这个抽象的概念具象化之后,就是这个函数执行环境的变量对象?如果是的话,由于作用域是变量的对象的抽象表达,而函数执行环境与变量对象之间是一一关联的,那么将函数执行环境和作用域看成一样的应该也没有什么问题吧?

问题2:
然后根据红包书说的,当代码即将在一个环境中执行前,会将这个环境压入到一个栈中,当这个环境中的代码执行结束,那么再将这个环境推出栈。那么到底是将什么压入栈中呢?我想一定包含了这个环境的变量对象的的一个东西。而且这个动态变化的栈就是我上面所说的动态作用域链的代码实现。

所以作用域链实际就是有函数执行的环境的变量对象构成的。

请问以上我对作用域、作用域链、执行上下文(执行环境) 、变量对象 以及他们之间的关系理解正确吗?

ps:看到这里感谢老师的耐心

正在回答 回答被采纳积分+3

1回答

双越 2022-02-25 18:50:30

简化一下问题吧,或者拆分为几个小问题。

我每天要回复几十个问题,题干太大的话看不过来,还请体谅~

0 回复 有任何疑惑可以回复我~
  • 提问者 慕丝1117639 #1
    问题一: 作用域:就是一块在定义函数的时候确定的区域,这个区域内部规定了访问变量的规则。请问这样理解对吗?
    问题二:作用域和函数执行环境的变量对象是否就是一个东西?或者可以将其看成一个东西
    问题三:  作用域链是不是由函数执行环境的变量对象组成的?
    问题四: 作用域链是否分为静态作用域链(函数嵌套时)和动态作用域链(递归时)。具体例子请看上图
    
    谢谢您
    回复 有任何疑惑可以回复我~ 2022-02-25 19:21:53
  • 双越 回复 提问者 慕丝1117639 #2
    第一,对。第二,可以这么理解;第三,不是执行时,而是定义时;第四,没听说过静态和动态之分,也不建议这么去理解。
    回复 有任何疑惑可以回复我~ 2022-02-25 20:32:58
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信