我一直在考虑 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
OperatorThe production UnaryExpression : void UnaryExpression is evaluated as follows:
- Let expr be the result of evaluating UnaryExpression.
- Call GetValue(expr).
- 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/