【问题标题】:What is the point of doing window.undefined = window.undefined做 window.undefined = window.undefined 有什么意义
【发布时间】:2014-01-05 18:18:51
【问题描述】:

我正在查看过去版本的 jQuery 代码,似乎在每个版本中都有they have this line of code 内部某处:

window.undefined = window.undefined;

我不明白为什么这很重要,更重要的是,这有什么作用。这似乎将undefined 分配给undefined,这对我来说毫无意义。

但这似乎很重要,我对此感到好奇。

【问题讨论】:

标签: javascript jquery


【解决方案1】:

window.undefined 并不总是存在,所以像 if (foo === undefined) 这样的代码会在旧浏览器中抛出 ReferenceError,因为 undefined 没有定义(即它没有被声明)。此代码只是确保 undefined 已定义(未定义)。

不过,这有点不必要,因为有很多方法可以在没有同名全局属性的情况下获得 undefined 的值。例如,您可以写if (foo === void 0),甚至可以写成if (foo === [][0])

Later versions 似乎假设window.undefined 存在于所有支持的浏览器中。 most recent versions 使用这样的模式:

(function( window, undefined ) {
    ...
})( window );

请注意,undefined 没有传入任何值,因此保证将其声明为局部变量,并具有undefined 的值。

【讨论】:

  • 全局 undefined 变量已在 EcmaScript 3 (§15.1.1.3) 中指定。浏览器只是没有实现这一点,还是有早期版本没有指定这一点?哪些较旧的浏览器完全没有全局 undefined 变量?
  • @Bergi IIRC 这是一个旧的 IE 东西。我现在正试图找到一些证据,但无法在那些旧浏览器上挖掘信息。不过,我确实记得几年前遇到过这种情况。
  • @Bergi 我刚刚检查了第 2 版,但似乎没有在那里指定。 IE 在完全采用 ES3 方面远远落后于曲线,所以我怀疑是他们。
  • 需要引用。你说的是什么浏览器?
  • @BenjaminGruenbaum 谷歌搜索表明undefined 在 IE 5 中不存在,这是有道理的,因为 IE5 在 ES3 发布前 9 个月推出,并且 ES2 没有指定全局 @ 987654337@ 财产。由于当时 MS 并没有真正为用户提供 IE 更新做太多工作,因此人们可能会将 IE5 放在机器上多年,而最古老的 jQ 版本可能想要支持这些用户。
【解决方案2】:

使用它,jQuery 定义了一个具有真正 undefined 值的全局变量。如果您在窗口范围内运行此代码,则拥有像 myvar 这样的全局变量意味着您在 window 范围内拥有此变量(如 window.mywar):

var myvar = "whatever";

javascript 定义你的变量,就好像你已经运行了这个:

window.myvar = "whatever";

假设我们没有像myundefined这样的全局变量,这意味着window.myundefined不存在并且window.myundefined没有值,这意味着window.myundefined真的是undefined,那么你可以创建一个全局变量在您的窗口范围内名为 undefined 的变量如下所示:

window.undefined = window.myundefined

并且这一行的结果与您上面提到的 jQuery 代码完全相同。换句话说,jQuery 可以用这段代码做同样的事情:

window.undefined = window.myundefined

window.undefined = window.whatever_you_want_with_no_value

这两个都定义了一个没有值的全局变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2010-11-29
    • 2010-10-15
    • 2011-02-05
    • 2012-02-28
    • 2018-01-13
    • 2015-03-18
    相关资源
    最近更新 更多