我需要在哪里放置一段JavaScript代码,初始化一个必须对页面执行的所有代码都可见的变量? (例如,元素上的事件处理程序将需要访问此变量)。
答案 0 :(得分:26)
没有全局变量的唯一方法是在函数范围内使用var
关键字。其他任何东西都是全局变量。
(function() {
var local = 5;
})();
如果函数是文字或函数定义并不重要, 是某种类型的函数。
全局变量示例:
<强> 1 强>:
var global = 5;
以上不在函数范围内,因此即使使用var
也是全局的。
<强> 2 强>
(function() {
global = 5;
})();
在上文中,没有使用var
,因此它成为隐含的全局。
第3 强>
function foo(){}
foo
未在另一个函数内部定义或未分配给对象键,因此可全局访问。
<强> 4 强>
(function() {
var local = global = 5;
})();
使用var
进行多次分配时,只有第一个变量变为局部变量...因此global
是全局变量,等于5。
<强> 5 强>
window.foo = 5;
前缀window.
是在浏览器上下文中定义全局变量的一种明确方式。
<强> 6 强>
this.x = 5;
默认情况下,在浏览器中,this
指向DOMWindow,除非您使用的是附加到非window
的对象的方法。它与#5相同。请注意,如果使用XMLHttpRequest之类的方法,则上下文属于窗口。
<强> 7 强>
with ( window ) { name = 'john'; }
如果使用with
语句并且不引用已具有属性的对象,则定义全局变量。最好避免一般使用with
关键字。
<强>结论:强>
就个人而言,我会将代码保存在匿名函数范围内,而仅在需要时显式声明全局变量。
(function() {
var governor = 'Schwarzenegger',
state = 'California';
window.president = 'Obama';
})();
在上面,我定义了governor
和state
变量,它们是我的函数的本地变量。我想明确地将president
定义为全局变量。这样,我不会混淆我定义为全局变量的变量,因为我明确地用window.
作为前缀。
答案 1 :(得分:11)
您可以使用任何函数或函数在不使用'var'关键字的情况下执行此操作。在任何其他脚本(可能是页面的顶部)之前分配它,以便脚本可以读取值。
您也可以将它放在包含的JS文件中,但是将它放在页面上通常更有用,因为您可以轻松地查看全局值,并且可以通过服务器端代码为每个页面修改它们。同时尝试防止在正文中分配全局变量,它可能会造成混淆并且难以阅读。
<head>
<script>
var numberOfDucks = 1000; // Global
function some_function() {
// numberOfDucks is accessible here
alert (numberOfDucks);
// until you mask it by defining a local variable using the 'var' keyword
var myLocal = 0; // is a local
anotherGlobal = 0; // is a global
}
</script>
<script>
// potentially some other script
</script>
<script src="even_more_script.js">
</head>
在函数中定义全局(隐含全局)并不是一个好主意,因为它会引起很多争议。
答案 2 :(得分:3)
您可以将该变量放在页面的开头(如果您想让它在任何地方都可见,则在全局范围内)但我建议两件事
1)因为你必须打开一个脚本块,所以避免在脚本阻止渲染时将其声明在页面体内。所以把它放在</head>
2)避免创建一个简单的var,而是使用命名空间,这样可以降低标识符冲突的风险
<script>
var YOUR_APP_NS = {};
YOUR_APP_NS.yourvar = ....
</script>
这是一种很好的做法,以免污染全球范围。如果以这种方式需要几个public var,你可以写
YOUR_APP_NS.yourvar1 = ....
YOUR_APP_NS.yourvar2 = ....
YOUR_APP_NS.yourvarN = ....
但全局变量仍为1
答案 3 :(得分:1)
用任何函数声明变量,这样它就变成了一个全局变量。
以下是全局变量的示例。第一个函数使用全局函数,但第二个函数使用具有相同名称的局部变量来掩盖全局变量。
var globalVar = 1;
function testFunc1 () {
globalVar = 2; //Updates the global variable
}
function testFunc2 () {
var globalVar = 5; // This variable masks the global and only updates within the scope of this function
globalVar = 3;
}
另外,您提到该代码段必须在任何其他引用之前初始化全局。为此,我建议您尽可能在元素中的任何其他javascript引用之前放置脚本块或引用javascript文件。如果您有其他javascript文件将依赖于全局变量,那么您可能希望确保它们不会加载,直到页面的其余部分首先使用defer属性加载。请参阅以下内容:
<script src="dependant.js" type="text/javascript" defer="defer"></script>
另一种选择是在加载初始脚本后动态添加依赖脚本。你可以使用像jQuery这样的东西:
$(window).load( function() {
$.getScript('dependant.js');
});
答案 4 :(得分:0)
<head>
<script>
var b = 0;
</script>
<script src="...">
</head>
<body>
...
</body>