6

我想知道是否可以添加到 Javascript 的document对象中。像:

var document = {
    name: "My Name"   
}
  • 这在 JavaScript 中合法吗?
  • 如果是,它是否被认为是“良好做法”,还是我应该避免它?
  • 如果我将其定义为变量,那么它是否被视为唯一对象,而不是 JS DOM 对象?

我对 JavaScript 很陌生,任何帮助都将不胜感激。

编辑:

在评论中进行了一些对话并对其进行了更多思考之后,我真的很想知道我是否可以操纵document变量并仍然可以document正常使用。

4

6 回答 6

21
  • 的,你可以这样做
  • ,你不应该那样

document只是global/window对象的另一个属性。如果您将其声明为范围内的形式参数或变量,则查找过程将首先在您声明的范围内匹配该名称,因此它有点重叠。

无论如何,你不想这样做,你为什么要这样做?对于您和其他正在查看您的代码的人来说,它是如此令人困惑。这是非常糟糕的做法

实际上,这就是为什么大多数“高级”javascript片段/库都以封闭函数范围开头的原因

(function( window, document, undefined ) {
    // window will always reference the "window" object that got originally passed in
    // document will always reference the "document" object that got originally passed in
    // undefined will always reference the "undefined value" that got originally passed in
}( window, window.document ));

..只是为了避免,所谓的混蛋效应。如果这样的闭包在文件的最顶部是开放的,它会确保您引用其中的原始对象,以防万一某些天才有好主意覆盖/重叠它们。

结论:您当然可以随意选择变量的名称,但出于显而易见的原因,您确实不应该使用诸如 ,window等这样显着名称的名称。documentundefined

于 2013-01-17T00:20:00.723 回答
6

你说你在做什么——添加到document对象——并不是你的代码实际上在做什么。

正在做的是重新定义 document. 如果要添加到它,请使用以下内容:

document.name = "My Name"

这样你仍然可以使用document. 但是,这通常仍然是不好的做法 - 您可以只使用不同的对象而不是文档:

myObject = {name:"My Name"};

然后myObject仍然是全球性的。修改document对象可能会产生不幸的副作用。

于 2013-01-17T00:24:21.227 回答
3

正如我在评论中指出的,ECMAScript 规范第 15 章告诉我们哪些对象是内置的;document不是其中之一。

DOMElement当您在该上下文中使用 Javascript 时,它只是您的网络浏览器设置的一个变量,因此,您可以使用对象或其他类型的对象或任何您喜欢的对象将其覆盖到您心中的内容。

但是,出于所有显而易见的原因,这是一个坏主意。

您可能可以向对象添加属性document而不会那么混乱,但我仍然想不出任何理由这样做。

于 2013-01-17T00:22:10.197 回答
3

您可以扩充或修改 JS 或给定浏览器中开箱即用的任何对象。

偶数:var Object = { name: "Trevor" }; 控制台.log(对象);

将记录: Object {name: "Trevor"} 尽管几乎所有东西都是由 JS 中的对象组成的。

不,糟糕的做法,然而。

于 2013-01-17T00:22:46.377 回答
2

document 变量是一个全局变量,代表您正在查看的当前页面(在某种意义上)。

即使它不在javascript 的保留关键字中,您也不应该这样使用它,因为您可以覆盖文档对象(请参阅此处)(尽管不像您尝试的那样简单),然后您将覆盖引用到旧的,并有一个糟糕的时间。

所以是的,你可以做到,不,你不应该。这是不好的做法。尝试选择一个不同的名称,这样接管您代码的人就不会丢失(或对您生气!)

于 2013-01-17T00:27:16.810 回答
1

你可以,但这不是一个好主意,阅读这篇文章

您可以在意外情况下覆盖内容。您可以增加所需的性能开销。而且你必须小心,因为不同的浏览器会有不同的行为。

于 2013-01-17T00:21:56.070 回答