【问题标题】:Is "var undefined;" considered as good? [closed]是“变量未定义;”算不算好? [关闭]
【发布时间】:2015-09-11 13:15:42
【问题描述】:

我认为undefined(或window.undefined)是一个常量变量,而不是保留字(如NaNInfinity,不像null)。 当使用UglifyJS压缩一个频繁使用undefined的Javascript文件时,最好声明一个局部变量来保存undefined

例如:

function main() {
  var undefined;
  ...
}

UglifyJS 会给我:

function main(){var n;...}

编辑

感谢@T.J。克劳德!现在我有自己的选择了。我确定undefinedNaNInfinitywindow 不是保留字,它们只是“只读”。所以,声明一个本地的undefined 没有问题(即使是严格模式)。我也不担心维护混乱的问题,我只需要写一个// comment/* comment */来解释这是什么意思。

【问题讨论】:

  • 这是一个见仁见智的问题,所以它对 SO 来说是题外话。
  • 你的意思是“好”,因为它会产生更小的压缩文件?
  • 不,不好。不管它是否有效,避免任何语言保留的单词总是好的。为了画得更好——你可以穿过雷区,你可以避免踩到地雷,你可以到达另一边。或者,您可以使用另一个没有地雷的场地,但仍然可以到达场地的另一边。结果=相同。雷区风险 = 巨大。常规字段的风险 = 无。轻松选择。没有必要往下看上膛的枪管,是吗? :)
  • 我想应该问at Code review
  • “我确定 undefined、NaN、Infinity 和 window 不是保留字” 没错。 Here's the list of reserved wordshere's where the now-read-only globals Infinity, NaN, and undefined are definedwindow 只在浏览器上定义,也是变量,不是关键字。

标签: javascript undefined uglifyjs


【解决方案1】:

它是否“好”是一个见仁见智的问题,所以让我们把它放在一边。

正面:

  • 更小的压缩文件,因为你所有的undefineds 都变成了n 或类似的。

否定:

  • 可能导致混乱的维护问题。

没有技术理由不这样做(除了可维护性)。在您的场景中,该变量将具有真正的值undefined。事实上,像这样编写通用库过去很常见:

(function(undefined) {
    // ...
})();

...这只是您提议的一种变体。作者为什么这样做?如果某些 eejit 在他们的代码之外这样做:

undefined = 42;

上述模式确保作用域函数中的 undefined 标识符确实具有值 undefined(因为我们在调用作用域函数时不传递任何 arg)。

这不是背书,只是强调这样做没有技术问题。

您再也看不到这种模式了,因为第 5 版规范 (2009) 将 undefined 全局变量(和其他几个)只读。分配给它会停止更改其值。请参阅Annex E 和它引用的第 15.1.1 节:

15.1.1:全局对象的值属性 NaN、Infinity 和 undefined 已更改为只读属性。

【讨论】:

  • 对未定义的查找不是更快吗?我想这不会有太大的不同。
  • @FelixKling:不,是,谢谢。我有一个盲点,我将undefinedargumentseval 一起放入,在严格模式下您不能将其用作标识符。 (这至少是第三次了。)但是他们将undefined 排除在该列表之外——可能是因为我上面提到的模式,以简化向严格模式的过渡。
  • @MinusFour:原则上它会。在实践中,由于全局现在是只读的,如果您不在任何干预范围内隐藏它,引擎可能会优化掉该遍历。
猜你喜欢
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2021-08-03
相关资源
最近更新 更多