我一直在考虑 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;
}
在这个例子中, counter 突然变成了一个全局变量,而不是一个局部作用域为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;
};
也可以。
我看到的优点是:
- 写的很短。
- 在某种程度上,它看起来像一个变量声明。
- 编辑添加:如果始终如一地完成,语法检查器(肉类或程序)很容易发现此类错误。
另一方面:
- 这很令人困惑。代码实际上并没有做任何事情。
- 未来的解释器可能会发现它是毫无意义的、无副作用的代码,然后将其优化掉。
有什么我忽略的方面吗?这是一个愚蠢的想法,还是至少有点站得住脚?
提问者的编辑:这应该是一个社区 wiki 问题,但我没有看到将其更改为该复选框的复选框。我隐约记得有一个。
编辑为大愚蠢:当然,+=
尝试在递增之前检索表达式的值。因此将示例重命名为resetCounter
而不是incrementCounter
,这样它就有点意义了。