Javascript 可变环境';s函数 执行上下文的变量/词汇环境组件

Javascript 可变环境';s函数 执行上下文的变量/词汇环境组件,javascript,Javascript,问题1: 对于什么VariableEnvironment执行上下文组件是必需的? 正如spec LexicalEnvironment component中所述 用于解析代码所做的标识符引用 在这个执行上下文中 但是VariableEnvironment组件用于 保存由VariableStatements和FunctionDeclarations创建的绑定 在这个执行上下文中 可以,但是对PrimaryExpression:Identifier的计算是使用LexicalEnvironment组件执

问题1

对于什么
VariableEnvironment
执行上下文组件是必需的? 正如spec LexicalEnvironment component中所述

用于解析代码所做的标识符引用 在这个执行上下文中

但是
VariableEnvironment
组件用于

保存由VariableStatements和FunctionDeclarations创建的绑定 在这个执行上下文中

可以,但是对
PrimaryExpression:Identifier
的计算是使用
LexicalEnvironment
组件执行,而不是运行执行上下文的
variableevironment

  • 让env成为正在运行的执行上下文的词典环境
  • 如果正在求值的语法结果包含在严格模式代码中,则让strict为true,否则让strict为false
  • 返回调用GetIdentifierReference函数的结果,该函数将env、Identifier和strict作为参数传递
  • 因此,VariableEnvironment是否只需要绑定存储

    建立功能上下文的过程如下:

  • 如果函数代码是严格代码,请将ThisBinding设置为thisArg
  • 否则,如果thisArg为null或未定义,请将ThisBinding设置为全局对象
  • 否则,如果类型(thisArg)不是对象,请将ThisBinding设置为ToObject(thisArg)
  • 否则将ThisBinding设置为thisArg
  • 将localEnv作为调用NewDeclarativeEnvironment的结果,并将F的[[Scope]]内部属性的值作为 争论
  • 将LexicalEnvironment设置为localEnv
  • 将VariableEnvironment设置为localEnv
  • 设code为F的[[code]]内部属性的值
  • 如10.5所述,使用函数代码和argumentsList执行声明绑定实例化
  • 其中,在步骤9,绑定仅添加到
    可变环境中。在步骤5中,内部属性向外部
    词典环境
    指示。所以我有一个问题

    问题2: 在创建功能代码的执行上下文之后,初始环境记录是否包含与外部的环境记录相同的绑定

    将以下代码片段考虑到全局代码中

    函数代码示例 问题3:


    在创建
    bar
    执行上下文之后,在开始执行函数code
    VariableEnvironment
    之前,它的环境记录将包含
    bar-->函数bar(){…},b-->{b:'b'},o-->{o:'o'}
    ,但是
    词汇环境
    的环境记录

    问题1

    VariableEnvironment是函数开头的作用域链的叶子。自从 所有变量和函数都挂在当前函数(或全局范围)的顶部,它定义了在给定函数中严格可见的标识符的范围

    当您将构造
    catch
    一起使用时,词汇环境扩展了VariableEnvironment。有关更多详细信息,请参阅

    这两种环境都用于名称解析。除了函数体(即函数中的函数)之外,大部分时间都在使用词汇环境,在函数体中(父函数的)应该使用VariableEnvironment

    正如我在前面的回答中所说的,这种情况并不常见,各种实现的行为也不同

    我不确定我是否理解您所说的“绑定存储”是什么意思。 在解析名称后,在适用的情况下(即参数传递或赋值),会进行绑定,无论哪种环境允许解析

    基本上,VariableEnvironment中的名称是局部变量(分配变量时绑定到堆对象)和参数(调用函数时绑定到传递的值,如规范10.4.3的步骤8-9所述)

    LexicalEnvironment中的名称要么是
    catch
    语句的异常上下文名称,要么是
    with
    语句的对象属性名称。当对语句求值时,它们将被绑定到相应的实例,并在语句体的末尾被释放

    例如:

    function stick_to_top (element)
    {
        with (element.style) { top = 0; }
    }
    stick_to_top (document.getElementById ("wanderer"));
    
    当语句
    top=0时,将绑定
    top

    名称解析将
    top
    解析为
    元素。top
    使用
    stick_to_top()
    的词法上下文,并通过
    with
    语句进行增强,该语句将包含所有
    元素的名称。style
    属性,并将
    元素
    解析为
    stick_to_top()
    的参数使用变量上下文
    stick_to_top()
    ,该变量上下文仅包含参数
    元素的名称

    最后,值0将分配给ID为“Loverter”的DOM对象的property style.top(当然,假设getElementById()找到了它)

    如果你想开个玩笑,试试这个:

    var tip = { style:{top:1}};
    var top = { style:'', invaluable_information:42};
    var tap = { };
    stick_to_top (tip);
    stick_to_top (top);
    console.log ("tip %o top %o", tip, top);
    stick_to_top (tap);
    
    结果:

    tip [object Object] top 0
    SCRIPT5007: Object expected
    
    tip的行为与常规DOM对象类似,因为我们为其定义了
    style.top
    属性

    tap没有
    style
    属性,因此
    tap.style
    未定义的
    ,解释器在尝试使用
    语句处理
    时抛出错误

    top是不吉利的。它确实有一个
    style
    属性,因此with语句很乐意创建一个空的词汇环境。现在,标识符
    top
    stick_to_top()
    中找不到了,所以名称解析返回到全局上下文,在全局上下文中可以找到它
    tip [object Object] top 0
    SCRIPT5007: Object expected