2

哎呀 - 错误发布

向所有人道歉。误读了我的代码并误解了它的行为。


源代码

有一个页面,其中变量shoe被初始化两次,一次index.html在一个被包含的变量中script.js

索引.html

<script src='script.js'></script>
<script>
   var shoe = { color: 'pink' };
</script>

脚本.js

var shoe = { size: 13 };

结果值

在 中,结果chrome值为shoe

>> shoe = { color: 'pink', size: 13 }

似乎chrome将这两个声明连接在一起——这非常酷而且非常有礼貌。

这是标准行为吗?我可以在浏览器之间指望这个吗?


运行时示例

http://www.trailsandtribulations.net/tech/barebone.html

来源是:

(我暂时解绑了 javascript)

多次声明的变量是state

4

4 回答 4

3

这种行为不是标准的,不应依赖。你应该这样做:

var shoe = shoe || {};
shoe.color = 'pink';

var shoe = shoe || {};
shoe.size = 13;

基本上,此语法分配shoeshoe它是否已定义,否则它会创建一个新对象。这将始终保留shoe它是否存在的先前状态,并允许您安全地对其进行修改。使用这种语法,尝试初始化变量一次或十次都没有关系。它总是正确的并且行为方式相同。

于 2012-11-26T03:15:04.343 回答
2

chome 知道将它们变成一个对象可能非常酷,但我建议您以后避免这样做。

更好的做法是创建一个类似于

var shoe = {
  size: 13,
  color: 'pink'
};

如果你想创建不同颜色的鞋子对象,你可以做类似的事情

function shoe(attributes) {
   this.size = attributes.size;
   this.color = attributes.color;
}

现在您可以使用以下内容创建一个新的鞋子对象

var my_shoe = new shoe({
  size: 10.5,
  color: 'white'
});

我现在可以像这样得到 my_shoe 的颜色:

my_shoe.color; // returns 'white'

依靠浏览器来解释您正在尝试做的事情绝不是一个好主意。

于 2012-11-26T03:13:25.513 回答
1

您的问题中的情况实际上根本没有发生(至少对于 chrome 的 23 版)。我将尝试向您展示这种情况。

首先,在您的“session.js”中声明“var state”,并带有以下属性。

var state = {
  inited: false,
  sid: null,
  hash: null,
  status: null,
  usr: {},
  domain: window.location.hostname.split('.').splice(-2).join('.')
};

然后在你的 html 的头部你有一个脚本块,它再次声明'var state',这会覆盖原来的对象。

var state = {
  sources: [
    '/tech/layout.jade',
    '/scripts/bladette.js',
    '/scripts/utils.js',
    '/scripts/modal.js',
    '/scripts/session.js',
    '/scripts/outliner.js',
    '/scripts/restful.js',
    '/scripts/params.js',
    '/scripts/menu.js',
    '/scripts/checks.js',
    '/scripts/notes.js',
    '/scripts/expand.js',
    '/scripts/store.js',
    '/scripts/storage.js' ],
  initFuncs: [ session.init ]
}

在此之后,您的代码中有很多地方可以为您的状态对象分配值。这就是为什么它开始看起来像两个对象被合并了。一个不存在的问题是“state.inited”不存在,但它是在“session.js”脚本中用这个属性声明的。您的对象正在通过其他函数获取这些属性。我的建议是在不同阶段/事件中通过您的 JS 进行调试,并检查“状态”对象以找出这些值的添加位置。记住'state.foo = 1;' 将给'state'对象一个'foo'的属性,不管它是否被声明。

希望有帮助。

于 2012-11-26T04:05:37.423 回答
-3

var 关键字已知会使页面内的变量成为全局变量 这是 Chrome 的一个“不错”功能,但很奇怪可以避免尝试使用 OOP 概念编写代码以避免这种浏览器依赖

于 2012-11-26T03:16:33.337 回答