javascript - 使用 void 作为语法糖来防止隐式全局变量,是或否?

标签 javascript syntax syntactic-sugar

我一直在考虑 javascript 编程风格,我想知道添加一些语法糖来防止使用隐式全局的容易犯的错误是否有意义,即:

var OuterFunction = function() { // closure container
    var renamedCounter = 0; // someone renamed counter,
    this.resetCounter = function () {
        counter = 0; // ... but forgot to check the inner functions as well.
        return this;
    };
    return this;
}

在这个例子中,计数器突然变成了一个全局变量,而不是一个 局部作用于 OuterFunction 的实例。

通过“声明”一个闭包捕获的变量void,你得到了一个免费的断言,很多 就像任何其他使用 counter 而不分配给它的代码一样。

this.resetCounter = function () {
    void counter; // this will throw an Error if counter is not in scope.
    counter = 0;
    return this;
};

编辑:正如jleedev指出的那样,仅仅使用变量名本身似乎可以测试是否 它存在,即

this.resetCounter = function () {
    counter;
    counter = 0;
    return this;
};

同样有效。

我看到的优势是:

  • 写起来很短。
  • 看起来像一个变量声明,在某种程度上确实如此。
  • 编辑添加:如果始终如一地完成,语法检查器(肉或程序)很容易发现此类错误。

另一方面:

  • 令人困惑。该代码实际上不做任何事情。
  • future 的解释器可能会发现它是无意义、无副作用的代码,并对其进行优化。

有没有我忽略的方面?这是一个愚蠢的想法,还是至少在某种程度上是站得住脚的?

问题提问者的编辑:这应该是一个社区维基问题,但我没有看到将其更改为该问题的复选框。我依稀记得有一个。

因愚蠢而编辑:当然,+= 会尝试在递增之前检索表达式的值。所以将示例重命名为 resetCounter 而不是 incrementCounter 这样它就有点意义了。

最佳答案

根据ECMASCript Language specification :

11.4.2 The void Operator

The production UnaryExpression : void UnaryExpression is evaluated as follows:

  1. Let expr be the result of evaluating UnaryExpression.
  2. Call GetValue(expr).
  3. Return undefined.

NOTE GetValue must be called even though its value is not used because it may have observable side-effects.

所以它永远不应该被优化掉。

然而,恕我直言,它看起来不像是“声明”一个变量,当然也不像一个变量,因此应该避免。

编辑:确实不应该准确地使用它,因为 GetValue 调用可能有副作用,例如,如果变量实际上是一个带有“getter”的属性。

关于javascript - 使用 void 作为语法糖来防止隐式全局变量,是或否?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5284535/

相关文章:

javascript - Google Apps 脚本 (Javascript) - findText 返回相对于内联图像的位置,而不是段落的开头

javascript - HTML、CSS、JS 响应式下拉菜单

java - ArrayList、List 或其他使用 <> 的类型中的 <> 代表什么?

c - node *node1 与 node* node1 有什么区别?

c++ - 如何确定它是强制转换还是构造函数调用

javascript - 使用 JavaScript 变量填充 HTML 标签

c - C中有这样的语法吗? %[^\n]s

c++ - 定义新的中缀运算符

c++ - 是否可以以任何方式(使用C++预处理器等)将shared_ptr<T>替换为T$,将weak_ptr<T>替换为T%,将unique_ptr<T>替换为T?

javascript - Instagram API access_token 请求和 Access-Control-Allow-Origin