考虑以下代码
var myVar = 'Hola';
{
let myVar;
myVar = 'Hello'
}
在第4行(myVar = 'Hello'),我们使用赋值运算符
当我看ecma262 in 赋值运算符评估的时候
它说赋值运算符的左边是LeftHandSideExpression,右边是AssignmentExpression。
换句话说,它看起来就像
LeftHandSideExpression = AssignmentExpression
有人能向我解释一下myVar将如何被评估吗?如果应该是LeftHandSideExpression呢?
发布于 2021-10-11 16:34:17
需要理解的主要部分是,在这个上下文中的evaluate意味着我们正在为语言中的各种语法部分运行这些Runtime Semantics: Evaluation部分。在以下情况下
myVar = 'Hello'如果我们查看13.15.2运行时语义:评估来计算AssignmentExpression行
1.a.让lref成为评估LeftHandSideExpression的结果。
将深入研究各个步骤,直到最终运行13.1.3运行时语义:评估为止,后者定义了myVar的评估行为。
如果您执行这一步骤,关键是lref不计算JS值,而是计算为Reference Record类型,这不是JS代码所知道的值,而是表示可以分配值的位置的概念。在代码段中,它基本上是对变量列表的作用域和变量的名称的引用,因此当稍后执行赋值时,它将在稍后完全解析。
这是首先评估左侧的行为,对于这样的例子来说更重要:
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),你可能会猜到第三节是变量赋值的结尾。
所以在你的案子里
(<scope with closest `var/let myVar`).SetMutableBinding("myVar", "Hello", false)发布于 2021-10-10 11:49:54
在块语句中,所有定义的变量都是本地的,因此块中的myVar将是"Hello"。外部,用var定义的变量是全局的,它的值从未改变,因为内部myVar是一个完全不同的变量,只是名称相同。因此,用var定义的外部var与其初始值"Hola"保持不变。
var myVar = "Hola";
{
let myVar;
myVar = "Hello";
console.log("inside:", myVar);
}
console.log("outside:", myVar);
发布于 2021-10-10 12:11:19
你可以在左手边有不同的东西,比如:
a = 'foo'a.b = ['foo','bar']new Object().b = ['foo','bar']foo().b = ['foo','bar']对于简单的a =情况,没有什么需要做的。
但是对于a.b =、new Object().b =和foo().b =,您首先需要评估左手边。
https://stackoverflow.com/questions/69511751
复制相似问题