首页 > 解决方案 > 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中产生明确定义的行为吗?

标签: javascriptecmascript-6ecmascript-5google-closure-compiler

解决方案


EcmaScript 规范在以下部分中有此内容var

var语句声明范围为运行执行上下文的 VariableEnvironment 的变量。var 变量在它们包含的词法环境被实例化时创建,并在创建时初始化为undefined。在任何 VariableEnvironment 的范围内,一个通用的BindingIdentifier可能出现在多个VariableDeclaration中,但这些声明共同只定义一个变量。由具有Initializer的VariableDeclaration定义的变量在执行VariableDeclaration时分配其InitializerAssignmentExpression的值,而不是在创建变量时。

换句话说,一个变量可能在一个var语句中出现不止一次,但相关变量仍然只会被声明一次,并且该声明将在执行任何代码(在该范围内)之前发生(也称为“提升”)。初始化将按其正常执行顺序执行。

因此,按照规范,您的示例代码相当于:

var a, b, c;
a = Ak - Aj;
b = Bk - Bj; 
c = Math.sqrt(a*a+b*b); 
a = a / c;
b = b / c;

推荐阅读