1

我得到了这个 HTML 页面。我想从 2 个具有公共变量的 javascript 文件中访问变量。我必须从这些与相应 javascript 相关的变量中获取值。我尝试使用加载它们,<script>但是当我访问 js 变量时,它只从最后一个 js 文件中获取值,换句话说,最后一个加载的 js 文件会覆盖变量值,并且只有这些值可以访问。我真的很感激这方面的帮助。

谢谢!!!

4

3 回答 3

6

您需要命名变量或使用具有不同名称的变量。听起来你在做什么相当于:

var x = 'foo';
var x = 'bar';

console.log(x);

    > bar

这应该是有道理的。但是,如果您使用名称空间,那么事情对您来说会更好。考虑两个文件,script-1.js并且script-2.js

// script-1.js
var s1 = {
    x:'foo'
}

// script-2.js
var s2 = {
    x:'bar'
}

...然后...

console.log(s1.x);

    > foo

console.log(s2.x);

    > bar

当然,这是一个相当陈词滥调的例子。

编辑

如果您不能自己更改文件,请执行此操作 - 在加载 script-1 之后但在加载 script-2 之前将值保存到其他名称/对象:

<script type="text/javascript" src="script-1.js"></script>

<script type="text/javascript">
    var s1 = {
        // Save off values here
        x:x,
        y:y
    }
</script>

<script type="text/javascript" src="script-2.js"></script>

// Then...
console.log(s1.x);  // will output the value from script-1.js
console.log(x);     // will output the value from script-2.js

不漂亮,但应该可以正常工作。

于 2013-01-14T22:17:44.587 回答
2

如果您的问题是变量发生冲突,并且您希望单独维护它们的值,则应将每个文件中的代码包装在一个闭包中。在这里,您可以应用立即调用函数表达式模式。

(function() {
    // your code here
    // all of it!
}());

这完全可以防止全局变量,如果您不需要跨文件共享任何内容,就是要走的路。

如果你需要创建一个共享全局,这样声明它:

var x = x || {}; // empty object as an example value

在每个文件的开头执行此操作。如果 x 是新的,它将被声明。如果它已经被声明,它将保留其先前的值。

你可以使用命名空间来做同样的事情,我强烈推荐它作为减少全局变量的简单方法。

var APP = APP || {};

APP.x = APP.x || {}; // example property of APP, in this case initializing an object

你也可以随时结合技术。在闭包之外设置一个命名空间对象,并在其中访问它们。这样,您只公开一个全局并限制其他所有内容的范围。

我希望这会有所帮助!

于 2013-01-14T22:43:05.247 回答
0

如果您对 javascript 文件有一定的控制权,Madbreak 的答案就是他们要走的路:每当您定义一个 javascript 库时,您都应该使用匿名函数和命名空间以避免冲突。

否则,您可以异步加载它们,eval一次加载一个(可能有一种不那么邪恶的方法,但我不知道) - 这样您就可以在下载的回调中使用第一个在它被第二个覆盖之前。但是,如果您长期需要它们,那么您可能会不走运。

如果您需要一个在另一个之前运行,但请记住,您需要在第一次下载的回调中加载第二个(除非您正在执行更多异步操作,否则无关紧要),否则这是一个竞争条件哪个会先走。

于 2013-01-14T22:33:48.943 回答