-4

我只是在徘徊谷歌浏览器在找到两个具有相同名称的变量时所做的事情,就我而言,这将是:查看带有重复变量的部分代码,这是该代码中代码的一小部分 我的问题是放置 Cannon 1(它的 id 是'Cannon1')工作正常,但放置黄金收集器(它的 id 是'goldC1')没有,这里发生了什么,我该如何解决?

笔记:

“警报”用于测试代码。该代码在Firefox中运行时有效。我的谷歌浏览器版本是 30.0.1599.101

有任何问题欢迎提问,我们会尽快回复,谢谢。

4

1 回答 1

8

Chrome,或者更准确地说是 V8,在§10.5中执行规范告诉它的操作(警告:这真的很繁重)

var

如果您var x;在同一范围内对同一符号有多个声明,则无关紧要,第二个则根本没有效果。但是,请注意var x = 1;(例如,使用初始化程序)实际上 var x;是,并且,单独,x = 1;。如果你重复它,只有var x;部分被忽略,分配不是。

所以:

var x = 5;
var x;
console.log(x); // 5
var x = 42;
console.log(x); // 42

...因为该代码确实代表了这一点:

var x;
x = 5;
console.log(x); // 5
x = 42;
console.log(x); // 42

更多:可怜的误解var (我博客上的文章)

函数声明

如果在同一范围内有多个使用相同名称的函数声明,则最后一个获胜。

foo(); // "foo the second!"

function foo() {
    console.log("foo the first!");
}

function foo() {
    console.log("foo the second!");
}

函数声明不同于函数表达式。以上是声明。我们知道这是因为函数引用并没有立即在表达式中使用(它不在 an 的右侧=,作为参数传递给另一个函数等)。函数声明发生在执行进入定义它们的上下文时,在任何分步代码运行之前。

函数表达式

另一方面,函数表达式在逐步执行到达它们时被处理,就像任何其他表达式一样:

//foo(); // This would be an error

var foo = function() {
    console.log("foo the first!");
};

foo(); // "foo the first!"

foo = function() {
    console.log("foo the second!");
};

foo(); // "foo the second!"
于 2013-10-29T18:20:30.447 回答