javascript - JavaScript 中单个 Var 声明中的重复标识符
问题描述
我注意到Google 的 Closer Compiler可能会将带有变量的语句打包到前面的var
声明中,从而在该声明中产生重复的标识符。这是我得到的输出示例:
var a = Ak - Aj,
b = Bk - Bj,
c = Math.sqrt(a*a+b*b),
a = a / c,
b = b / c
请注意如何在a
同一个声明b
中重新声明和分配新值var
。此外,它看起来像 和 的旧值,a
用于b
它们的第二次初始化。这会在ES5 / ES6中产生明确定义的行为吗?
解决方案
EcmaScript 规范在以下部分中有此内容var
:
var
语句声明范围为运行执行上下文的 VariableEnvironment 的变量。var 变量在它们包含的词法环境被实例化时创建,并在创建时初始化为undefined。在任何 VariableEnvironment 的范围内,一个通用的BindingIdentifier可能出现在多个VariableDeclaration中,但这些声明共同只定义一个变量。由具有Initializer的VariableDeclaration定义的变量在执行VariableDeclaration时分配其Initializer的AssignmentExpression的值,而不是在创建变量时。
换句话说,一个变量可能在一个var
语句中出现不止一次,但相关变量仍然只会被声明一次,并且该声明将在执行任何代码(在该范围内)之前发生(也称为“提升”)。初始化将按其正常执行顺序执行。
因此,按照规范,您的示例代码相当于:
var a, b, c;
a = Ak - Aj;
b = Bk - Bj;
c = Math.sqrt(a*a+b*b);
a = a / c;
b = b / c;
推荐阅读
- java - 将 getPasswordAuthentication 函数转换为 Kotlin
- corda - Corda - 如何使用 Java 实现 expectEvents 并行谓词
- android - 每周每天的通知
- c - 在 C 中使用 for 循环来测试函数的返回值
- cookies - 用户选择退出 Cookie 后,我可以删除 cookie 吗?
- python - ax.plot_surface() 错误地在散点上方显示表面
- php - 没有实际数据库列的表单上的 Laravel Nova 额外“图像”字段
- xaml - Xamarin Forms Access 父集合项
- python - 指定我的python包依赖于opencv的正确方法是什么?
- c# - “构造函数”不是可识别的属性位置