我得到了这个 HTML 页面。我想从 2 个具有公共变量的 javascript 文件中访问变量。我必须从这些与相应 javascript 相关的变量中获取值。我尝试使用加载它们,<script>
但是当我访问 js 变量时,它只从最后一个 js 文件中获取值,换句话说,最后一个加载的 js 文件会覆盖变量值,并且只有这些值可以访问。我真的很感激这方面的帮助。
谢谢!!!
我得到了这个 HTML 页面。我想从 2 个具有公共变量的 javascript 文件中访问变量。我必须从这些与相应 javascript 相关的变量中获取值。我尝试使用加载它们,<script>
但是当我访问 js 变量时,它只从最后一个 js 文件中获取值,换句话说,最后一个加载的 js 文件会覆盖变量值,并且只有这些值可以访问。我真的很感激这方面的帮助。
谢谢!!!
您需要命名变量或使用具有不同名称的变量。听起来你在做什么相当于:
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
不漂亮,但应该可以正常工作。
如果您的问题是变量发生冲突,并且您希望单独维护它们的值,则应将每个文件中的代码包装在一个闭包中。在这里,您可以应用立即调用函数表达式模式。
(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
你也可以随时结合技术。在闭包之外设置一个命名空间对象,并在其中访问它们。这样,您只公开一个全局并限制其他所有内容的范围。
我希望这会有所帮助!
如果您对 javascript 文件有一定的控制权,Madbreak 的答案就是他们要走的路:每当您定义一个 javascript 库时,您都应该使用匿名函数和命名空间以避免冲突。
否则,您可以异步加载它们,eval
一次加载一个(可能有一种不那么邪恶的方法,但我不知道) - 这样您就可以在下载的回调中使用第一个在它被第二个覆盖之前。但是,如果您长期需要它们,那么您可能会不走运。
如果您需要一个在另一个之前运行,但请记住,您需要在第一次下载的回调中加载第二个(除非您正在执行更多异步操作,否则无关紧要),否则这是一个竞争条件哪个会先走。