【问题标题】:Why does one reuse `undefined`? [duplicate]为什么要重用“未定义”? [复制]
【发布时间】:2013-07-25 14:25:34
【问题描述】:

John Resig's slideshow 关于他如何构建 jQuery 1.4 中,他提到了一点,他在 jQuery 闭包中添加了一个 undefined 变量,因为“我们可以重用(变量)”。

undefined 不是普通变量:

> var undefined = 4
  undefined
> undefined
  undefined

因此,我们知道 undefined 不是变量。那么为什么要在 jQuery 源代码中重新定义 undefined 呢?

【问题讨论】:

  • 在旧浏览器中,可以重新定义全局undefined。现在已经不是这样了。
  • @CrazyTrain 这应该是一个答案。
  • @CrazyTrain 是对的,你可以在闭包内定义 undefined:(function (undefined) { undefined = 5; console.log(undefined); })()

标签: javascript jquery


【解决方案1】:

因为在某些 JavaScript 引擎中,可以将 undefined 设置为一个值。这是为了确保undefined 真的是undefined

【讨论】:

  • 我建议不要这样保护。这只是愚蠢的。如果人们愚蠢到重新定义undefined,那么他们应该得到什么。
  • @user1737909:很公平,但如果是恶意脚本怎么办:O
  • @user1737909 存在涉及来自多个来源的脚本的上下文(想想一个“杂志”广告支持的网站),因此人们可能希望保护自己的代码免受其他人的愚蠢(或恶意)的影响。
  • 没关系。如果有人重新定义prototype 怎么办?你会以同样的方式注定要失败,你不能保护一切。仅仅防止未定义最多只会让您感到更安全。
  • @user1737909 虽然我同意,但我不认为你可以构建一个 JavaScript 库而不添加一些故障保险柜来防止不必要的错误,无论它们多么愚蠢。
【解决方案2】:

除了 +Rocket Hazmat 的回答之外,当您的代码经常使用 undefined 时,您可以在压缩后稍微减小文件大小。这是因为局部变量 undefined 的名称可能被压缩器破坏,而全局变量 undefined 可能不会:

foo === undefined;
//      ^----- don't touch this, put "undefined" in the compressed result

(function (undefined) {
    foo === undefined;
})();
// may however be mangled to
(function(u){foo===u})();

【讨论】:

  • @user1737909:void 0 不能从 6 个字符减少。 undefined 可以减少到 1。
  • 你说的是gzip压缩还是缩小?
  • @josh3736 那么我希望缩小器不要触及undefined,因为它应该知道它在技术上是一个保留字。在这种情况下,void 0 更短。压缩它可能会产生您正在谈论的效果
  • 不知道undefined作为参数是否比void 0快。应该没关系吧。 (function (u) { })() 是一个 1 字符串 undefined,我想知道 JIT 是否能够静态优化它(可能)
  • @josh3736 你可以随心所欲地称呼它(或不叫它),但它是一个“保留词”,因为它是语言的一个特性,不应该被修改。通过“缩小器通常不会触及全局变量”,我希望你的意思是他们。如果缩小器缩小了全局变量,则不应使用它。是的,从 ES5 开始,全局 undefined 有一些特别之处,而不是严格模式……它是不可写的:es5.github.io/#x15.1.1.3
猜你喜欢
  • 2021-08-01
  • 1970-01-01
  • 2016-04-28
  • 2011-11-02
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
相关资源
最近更新 更多