在JavaScript中声明两个具有相同名称和范围的变量时会发生什么?

时间:2011-01-13 03:54:20

标签: javascript module-pattern

如果我声明两个具有相同名称和范围的变量会怎样?

var foo = (function() {
    return {
        alertMe: function() {
            alert("foo1");
        }
    }
})();

var foo = (function() {
    return {
        alertMe: function() {
            alert("foo2");
        }
    }
})();

foo.alertMe();

我问,因为我在我的网站上动态加载小portlet,每个portlet都有自己的带有JavaScript模块的脚本标记。问题是,用户可以复制portlet,这意味着很可能会出现类似上述情况。

3 个答案:

答案 0 :(得分:6)

在您的示例中,它们都是未定义的,因此您的值为undefined

无论如何,第二个var被忽略。您将获得与没有相同的结果,这意味着foo将被新值覆盖。

所以,结果如同:

var foo = (function() {
    alert("foo1");
})();

foo = (function() {  // I'm overwriting the value of "foo"
    alert("foo2");
})();

编辑:问题中的代码已更改。如果运行代码,结果现在更加可观察。 foo变量对第一个对象的引用将替换为对第二个对象的引用。第一个参考文献丢失了。

答案 1 :(得分:0)

最后一个变量可以工作, 在您的示例中,将忽略第一个var `var foo =(function(){     警报( “foo1”); })();

foo =(function(){//我正在覆盖“foo”的值     警报( “foo2的”); })(); `

答案 2 :(得分:0)

为避免此问题,请将不同模块的java脚本封装在不同的名称空间中。

Name space explanation

您还可以查看

How do I declare a namespace in JavaScript?