跨浏览器的有效JavaScript名称

跨浏览器的有效JavaScript名称,javascript,variables,Javascript,Variables,在您快速发布“RTFM”或我访问过的一堆链接之前,我完全知道有文档记录的不可使用的保留变量名 我能找到的最佳列表如下: 和 我要求的是仅在1或2个浏览器上无效的变量名 例如,我可以定义打印,但这会导致错误,因为打印已在全局范围窗口上定义。为什么不将其记录为保留关键字 是否有大量的变量名需要避免 我要求的是仅在1或2个浏览器上无效的变量名 如果存在任何此类词语,则该浏览器将不符合ECMA-262。ECMA-262中只有保留字是“无效变量名”(前提是该名称符合变量名的标准,如允许的字符) 为什么

在您快速发布“RTFM”或我访问过的一堆链接之前,我完全知道有文档记录的不可使用的保留变量名

我能找到的最佳列表如下:

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

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

是否有大量的变量名需要避免

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

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

为什么[print]没有记录为保留关键字

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

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

是否有大量的变量名需要避免

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

e、 g.窗口对象的以下链接:

  • W3C HTML5窗口对象:
  • MDN窗口对象:
  • MSDN窗口对象:
  • 此外,有一个简单的for..In循环(根据Berji的回答)来发现特定时间的可枚举属性,但是这可能不是所有可能属性名称的综合列表,并且将包括用户定义的属性以及默认浏览器属性,没有区别


    更好的策略是采用命名约定,以避免可能的属性名称,并最大限度地减少全局变量(即窗口对象的用户定义属性)的使用。

    如果您想要一大串浏览器定义的变量来扩展保留关键字的正式列表,请在控制台的空白页上键入以下内容(关于:空白):

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


    然而,它将依赖于浏览器,因为有些人没有实现所有使用
    窗口
    界面的HTML5起草的东西;例如,你在IE9中找不到
    “Worker”
    ,在FF中找不到
    “openDatabase”
    ,等等。此外,它可能不会列出像
    “onload”这样的遗留属性
    ,尽管您将能够获取它的属性描述符(以及
    窗口中的“onload===true
    )。

    您可以设置
    window.print=“你好,世界!”
    随时可以。但不管怎样,你想做什么?只是为了避免语法错误?javascript语言独立于浏览器中出现的主机对象。
    print
    是浏览器中
    窗口
    对象上的一种方法。它不是javascript语言的一部分。因为浏览器生成的所有属性de>window
    对象在javascript上下文的全局范围内可用,这些宿主方法或属性可能会影响javascript代码。没有太多关系,但请查看此网站:@MaxArt Yes…避免语法错误是重点。@Mageek这很好,但只涉及上面链接中已引用的保留关键字。Th请重读上面以问号结尾的句子。缩写版本:与浏览器脚本相关的唯一一个有“保留字”概念的标准是ECMA-262。其他人没有这个概念,所以他们没有保留字。我认为OP想要一个不同浏览器不喜欢的变量名列表,不是根据ECMAScript,而是浏览器实际不喜欢的。包括不符合的东西。谢谢@VahurRoosimaa。像你这样的贡献者和我接受的答案我希望如此。@RobG不幸的是,我们中的一些人不得不支持不兼容的浏览器。事实上,你回答“不…”我没有任何应该避免的变量是完全不正确的。我将使用一个简单的HTML5在browserstack上运行JSFIDLE,其中包含一个
    JSON。将这两个命令的结果字符串化。我将从所有浏览器编译该列表,这将给出最终结果。那么,你能将该列表发布到某个地方吗?我很乐意很高兴看到:-)我会把它写在博客上,并在这里添加链接。谢谢在开始之前,您可能会为不支持
    对象的旧浏览器添加一个带有for-in循环的回退。getOwnPropertyNames
    …主机对象不必支持本机方法,因此无法保证上述方法能够正常工作,甚至可能会引发错误(在不支持
    Object.getOwnProperties
    的浏览器中,电子邮件当然会出现)
    >>> Object.getOwnPropertyNames(window)
    >>> Object.getOwnPropertyNames(Object.getPrototypeOf(window)) // sometimes not Object