首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ecma262中的赋值表达式

ecma262中的赋值表达式
EN

Stack Overflow用户
提问于 2021-10-10 01:54:06
回答 3查看 175关注 0票数 2

考虑以下代码

代码语言:javascript
复制
var myVar = 'Hola';
{
  let myVar;
  myVar = 'Hello'
}

在第4行(myVar = 'Hello'),我们使用赋值运算符

当我看ecma262 in 赋值运算符评估的时候

它说赋值运算符的左边是LeftHandSideExpression,右边是AssignmentExpression。

换句话说,它看起来就像

LeftHandSideExpression = AssignmentExpression

有人能向我解释一下myVar将如何被评估吗?如果应该是LeftHandSideExpression呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-10-11 16:34:17

需要理解的主要部分是,在这个上下文中的evaluate意味着我们正在为语言中的各种语法部分运行这些Runtime Semantics: Evaluation部分。在以下情况下

代码语言:javascript
复制
myVar = 'Hello'

如果我们查看13.15.2运行时语义:评估来计算AssignmentExpression

1.a.让lref成为评估LeftHandSideExpression的结果。

将深入研究各个步骤,直到最终运行13.1.3运行时语义:评估为止,后者定义了myVar的评估行为。

如果您执行这一步骤,关键是lref不计算JS值,而是计算为Reference Record类型,这不是JS代码所知道的值,而是表示可以分配值的位置的概念。在代码段中,它基本上是对变量列表的作用域和变量的名称的引用,因此当稍后执行赋值时,它将在稍后完全解析。

这是首先评估左侧的行为,对于这样的例子来说更重要:

代码语言:javascript
复制
foo().bar = val();

因为求左意味着foo()运行在val()之前,这正是您所期望的。在本例中,foo()运行,然后我们得到一个Reference Record,返回值foo()作为赋值的目标,bar作为要分配的属性名。

回到13.15.2运行时语义:评估,我们可以

1.表演?PutValue(lref,rval)。

这就是最终任务发生的地方。rval"Hello"字符串本身,因为它已经被计算过了。如果你看一看6.2.4.6 PutValue ( V,W),你可能会猜到第三节是变量赋值的结尾。

  • 6.a.基地是V[基地]。
  • 6.b.断言:基础是环境记录。
  • 6.c.回来?base.SetMutableBinding(V.[ReferencedName],W,V.[严格])

所以在你的案子里

代码语言:javascript
复制
(<scope with closest `var/let myVar`).SetMutableBinding("myVar", "Hello", false)
票数 3
EN

Stack Overflow用户

发布于 2021-10-10 11:49:54

在块语句中,所有定义的变量都是本地的,因此块中的myVar将是"Hello"。外部,用var定义的变量是全局的,它的值从未改变,因为内部myVar是一个完全不同的变量,只是名称相同。因此,用var定义的外部var与其初始值"Hola"保持不变。

代码语言:javascript
复制
var myVar = "Hola";
{
  let myVar;
  myVar = "Hello";
  console.log("inside:", myVar);
}
console.log("outside:", myVar);

票数 2
EN

Stack Overflow用户

发布于 2021-10-10 12:11:19

你可以在左手边有不同的东西,比如:

代码语言:javascript
复制
a = 'foo'
代码语言:javascript
复制
a.b = ['foo','bar']
代码语言:javascript
复制
new Object().b = ['foo','bar']
代码语言:javascript
复制
foo().b = ['foo','bar']

对于简单的a =情况,没有什么需要做的。

但是对于a.b =new Object().b =foo().b =,您首先需要评估左手边。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69511751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档