【问题标题】:Cross Browser Valid JavaScript Names跨浏览器有效的 JavaScript 名称
【发布时间】:2012-06-07 12:30:42
【问题描述】:

在您使用“RTFM”或我访问过的一堆链接快速发布之前,我完全了解不使用的文档化保留变量名称。

我能找到的最好的列表在这里:

http://es5.github.com/x7.html#x7.6.1.1http://www.javascripter.net/faq/reserved.htm

我要求的是仅在 1 或 2 个浏览器上无效的变量名称。

例如,我可以定义print,但这会导致错误,因为已在全局范围window 上定义了打印。为什么不将此记录为保留关键字?

是否有一大串要避免的变量名?

【问题讨论】:

  • 您可以随时设置window.print = "Hello, world!"。但无论如何,想要做什么?只是为了避免语法错误?
  • javascript 语言独立于出现在浏览器中的宿主对象。 print 是浏览器中window 对象的一个​​方法。它不是 javascript 语言的一部分。因为浏览器使 window 对象的所有属性在 javascript 上下文的全局范围内可用,所以这些宿主方法或属性会影响 javascript 代码。
  • 没有太多关系,但看看这个网站:mothereff.in/js-variables
  • @MaxArt 是的...避免语法错误是重点。
  • @Mageek 这很好,但只涉及上面链接中已经引用的保留关键字。不过还是谢谢。

标签: javascript variables


【解决方案1】:

我要求的是仅在 1 或 2 个浏览器上无效的变量名称。

如果存在任何此类词,则该浏览器将不符合 ECMA-262。只有 ECMA-262 中的保留字是“无效的变量名”(前提是该名称符合变量名的标准,例如允许的字符)。

为什么不将 [print] 记录为保留关键字?

保留字只能由具有保留字概念的标准定义,唯一与在浏览器中编写 DOM 相关且具有该概念的标准是 ECMA-262。而且它没有将 print 列为保留字,所以它不是一个。

定义宿主对象及其属性的 DOM 标准有多种,最接近保留字概念的是只读属性或不可写属性。 window.print 是在 HTML5 中定义的,它没有将其定义为不可写,或者如果分配给它或尝试修改它,它应该抛出错误。所以它不会表现出任何接近保留字的行为。

是否有一大串要避免的变量名?

没有,因为没有。但是,宿主对象(如 window)具有可写的默认属性,您应该避免覆盖它们。它们应该列在不同的地方,例如 HTML5 规范和浏览器供应商文档。

例如window 对象的以下链接:

  1. W3C HTML5 窗口对象:http://www.w3.org/TR/html5/browsers.html#the-window-object
  2. MDN 窗口对象:https://developer.mozilla.org/en/DOM/window
  3. MSDN 窗口对象:http://msdn.microsoft.com/en-us/library/ms535873(v=vs.85).aspx

此外,还有一个简单的 for..in 循环(根据 Berji 的回答)来发现特定时间的可枚举属性,但这可能不是所有可能属性名称的完整列表,并且将包括用户定义的属性与默认浏览器属性没有区别。

采用避免可能的属性名称并尽量减少使用全局变量(即窗口对象的用户定义属性)的命名约定是一种更好的策略。

【讨论】:

  • -1 啊。请重读以上以问号结尾的句子。
  • 缩略版:与浏览器脚本相关的唯一具有“保留字”概念的标准是 ECMA-262。其他的没有概念,所以没有保留字。
  • 我认为OP想要一个不同浏览器不喜欢的变量名列表,不是根据ECMAScript,而是浏览器实际上不喜欢的。包括不合规的东西。
  • 感谢@VahurRoosimaa。像你这样的贡献者和我接受的答案重新燃起了我对 SO 的希望。
  • -1。 @RobG 不幸的是,我们中的一些人必须支持不兼容的浏览器。你回答“不......”没有任何我应该避免的变量的事实是完全不正确的。
【解决方案2】:

如果您想要浏览器定义的变量的大列表来扩展保留关键字的官方列表,请在您的控制台中的空白页面(about:blank)中键入以下内容:

>>> Object.getOwnPropertyNames(window)
>>> Object.getOwnPropertyNames(Object.getPrototypeOf(window)) // sometimes not Object

这将产生一个你绝对不应该使用的字符串数组。它也包括"print"

然而它将依赖于浏览器,因为有些没有实现所有使用Window 接口的很酷的 HTML5 起草的东西;例如你不会在 IE9 中找到 "Worker",在 FF 中找不到 "openDatabase" 等等。此外,它可能不会列出像 "onload" 这样的遗留属性,尽管您将能够获得它的属性描述符(和 "onload" in window === true)。

【讨论】:

  • 我将使用简单的 HTML5 在 browserstack 上运行 jsFiddle,其中包含一个 <pre>JSON.stringify 这两个命令的结果。我将从所有浏览器中编译列表,这将为我提供最终结果。
  • 那你能把这份名单公布在某个地方吗?我很高兴看到它:-)
  • 我会写博客并在此处添加链接。谢谢!
  • 在开始之前,您可以为不支持 Object.getOwnPropertyNames 的旧浏览器添加一个带有 for-in-loop 的回退...
  • 宿主对象不一定要支持原生方法,所以你不能保证上面的方法完全可以工作,甚至可能会抛出错误(在不支持@的浏览器中肯定会抛出错误) 987654331@)
猜你喜欢
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 2011-08-02
  • 2011-12-18
相关资源
最近更新 更多