从JS中的ids自动创建变量?

amo*_*era 36 javascript

就在今天经过几年的javascript编程之后,我遇到了令我吃惊的东西.浏览器为每个具有id的元素创建对象.对象的名称将与id匹配.

所以如果你有:

<div id ="box"></div>
Run Code Online (Sandbox Code Playgroud)

你可以做:

alert(box); //[object HTMLDivElement]
Run Code Online (Sandbox Code Playgroud)

没有先为该变量分配任何内容.看演示.

由于某种原因,这似乎是在标准中,即使它在某些情况下可能会破坏代码.有一个开放的bug来结束这种行为,但我现在更感兴趣摆脱它.

你们知道是否有办法禁用它(严格的模式可能)?我是否过分重视?因为这看起来确实是一个坏主意.(它是由IE推出给你一个提示).

更新:似乎FF只在怪癖模式下执行此操作.像IE6 +和Chrome这样的其他浏览器可以立即实现.

Hal*_*yon 11

ECMAScript 5 strict应该对此有所帮助,因为您不能使用未声明的变量.我不确定哪些浏览器目前支持严格模式,但我知道Firefox 4.

您链接的HTML规范提到了通过将此行为限制为仅限于怪癖而减少全球范围污染的提案.

我不知道这个功能是否在原始规范中,但我确实希望在后续版本的ECMAScript中将其删除,禁止或以其他方式无效.ES6将基于ES5严格.

JavaScript有许多功能,使初学者和初学者更容易使用,我怀疑这是一个这样的功能.如果您是专业人士,并且您希望使用高质量的代码"use strict";并且始终使用JSLint代码.如果您使用这些指南,此功能永远不会打扰您.

这是一个关于ES5礼貌的YUI剧院的有用视频(虽然它已经有2年了,但目前仍然没有相关的ES6).

  • 5年后,它仍然存在 (3认同)
  • 7年后,它仍然存在! (3认同)
  • 严格模式对此没有影响。 (2认同)
  • 6年后,它仍然存在! (2认同)
  • 8年后,它仍然存在! (2认同)
  • 9年过去了,它仍然存在! (2认同)

jfr*_*d00 6

我认为这不是什么大不了的事.对我们这些考虑全球名称空间污染和冲突的人来说,这似乎很混乱,但在实践中它并没有真正引起问题.

如果您声明自己的全局变量,它将覆盖浏览器为您创建的任何内容,因此实际上没有任何冲突.唯一可以看到它可能导致问题的地方是,如果您正在测试是否存在全局声明,并且基于对象ID的"自动"全局变得困难,并使您感到困惑.

在实践中,我从未见过这是一个问题.但是,我同意这似乎是他们应该摆脱或允许你关闭的东西.