JavaScript中的全局变量?
我是新来的Javascript和下面的代码是混淆了我的地狱。根据我的理解,您可以通过将var放在它们前面来为全局变量赋值,并且在首先声明全局时不需要定义任何初始值。但是,为什么下面的代码不起作用? (通过不工作我的意思是在main()中调用document.write时吐出“undefined”为“ulat”)。JavaScript中的全局变量?
var ulat;
function write(latitude) {
ulat = latitude;
document.write("<h1> This works:" + ulat + "</h1>");
}
function getloc() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
function(position) {
write(position.coords.latitude);
},
function (error) {
switch(error.code) {
case error.TIMEOUT:
alert ('Timeout');
break;
case error.POSITION_UNAVAILABLE:
alert ('Position unavailable');
break;
case error.PERMISSION_DENIED:
alert ('Permission denied');
break;
case error.UNKNOWN_ERROR:
alert ('Unknown error');
break;
}
});
}
else {
alert("Geolocation is not supported by your web browser.");
}
}
function main() {
getloc();
document.write("<h1> This doesn't work: " + ulat + "</h1>");
}
任何帮助?谢谢!
var
用于局部变量。对于全局变量,请单独给出或作为window.reference
。尝试修改您的代码以删除第一行var ulat;
。
'var'对全局和本地人一样多。请注意,全局变量是应该避免的。 – 2011-04-02 16:33:37
getCurrentPosition
是异步。当你打电话时它不会运行,当你打电话时开始运行。所以当main
检查一个值时,成功回调没有被调用,并且没有任何东西被分配给ulat
。
因此,这里是你的代码做什么:
-
main
被称为 -
main
电话getloc
-
getloc
看到的是地理位置信息,并将开始地理位置请求。然后立即返回。 -
main
输出值ulat
,该值仍然为undefined
。 -
一段时间后,您的
success
回调(或当然,失败)被调用。在这一点上,我有点惊讶你的页面没有变为空白,因为你在主解析之后会调用document.write
,这意味着document.open
,这会撕下页面并以空白的页面开始。但我并不经常使用document.write
来记住所有的变幻莫测...
这很有道理。那么我能做些什么来解决它?这个代码的最终目的是让lat和long的全局变量能够在其他地方使用(即,在网站上显示以及添加到谷歌地图) – Dan 2011-04-02 16:37:45
@Dan:删除文档。写'电话,你是金,最终'ulat'将有价值(如果地理电话工作)。在页面的主要解析完成后,您不能使用'document.write',所以您需要使用[DOM API](http://www.w3.org/DOM/DOMTR)或您最喜欢的库 - 像[jQuery](http://jquery.com),[Prototype](http://prototypejs.org),[YUI](http://developer.yahoo.com/yui/),[Closure ](http://code.google。(http://en.wikipedia.org/wiki/List_of_JavaScript_libraries) - 修改页面后渲染的内容。 – 2011-04-02 16:40:29
@丹:但我会建议避免全局变量。如果将整个脚本放入范围函数中,则可以在该函数中包含所有需要的局部变量,而不会与全局名称空间中的其他事物发生冲突,而这些其他事物已经*真正*杂乱(特别是在IE上) 。以下是使用范围函数(HTML窗格底部的代码)的示例:http://jsbin.com/usoca3/2/edit – 2011-04-02 16:44:41
你曾经调用'main()'吗? – climbage 2011-04-02 16:30:59
当你承认存在'document.write'时,我建议不要创建一个名为'write'的函数。 – mVChr 2011-04-02 16:31:33
当你说“不工作”时,更具体的做法是一个很好的做法。 – hugomg 2011-04-02 16:31:44