初始化外部函数时无法访问变量

时间:2010-02-18 18:47:21

标签: javascript global-variables

当我使用这样的代码时,它可以正常工作:

function removeWarning() {
    var systemStatus = document.getElementById("system-status");
    systemStatus.innerHTML = "";
}

function indicateInvalidUsername() {
    var systemStatus = document.getElementById("system-status");
    systemStatus.innerHTML = "Invalid username";
}

然而,当我想将systemStatus移动为全局变量时,它不起作用:

var systemStatus = document.getElementById("system-status");

function removeWarning() {
    systemStatus.innerHTML = "";
}

function indicateInvalidUsername() {
    systemStatus.innerHTML = "Invalid username";
}

我应该在这做什么?

7 个答案:

答案 0 :(得分:38)

这实际上取决于JavaScript代码的位置。

问题可能是由于行

时没有加载DOM引起的
var systemStatus = document.getElementById("system-status");

已执行。您可以尝试在onload事件中调用它,或者理想地使用来自JavaScript框架的DOM ready类型事件。

答案 1 :(得分:27)

确保在任何代码块之外的“root”级别声明变量。

您也可以完全删除var,虽然这是not recommended并且会发出“严格”警告。

根据documentation at MDC,您可以使用window.variablename设置全局变量。

答案 2 :(得分:6)

我的猜测是在运行变量声明后声明了system-status元素。因此,在声明变量时,它实际上被设置为null?

您应该只声​​明它,然后从onLoad处理程序中分配它的值,因为这样您就可以确定它已正确初始化(加载)了相关元素。

您也可以尝试将脚本放在页面底部(或者至少在声明system-status元素后的某个位置),但不能保证始终有效。

答案 3 :(得分:6)

在外部作用域中声明systemStatus并在onload处理程序中指定它。

systemStatus = null;

function onloadHandler(evt) {
    systemStatus = document.getElementById("....");
}

或者,如果您不想使用onload处理程序,请将脚本标记放在HTML的底部。

答案 4 :(得分:4)

This article就是解决这些问题的答案! ;)仔细阅读!

答案 5 :(得分:2)

全局变量最好用外部JavaScript文件表示:

var system_status;

确保在其他任何地方都没有使用过它。然后,要访问页面上的变量,只需引用它。比如说,你想在文本框中填写结果,

document.getElementById("textbox1").value = system_status;

要确保对象存在,请使用jQuery的文档就绪功能。

示例:

$(function() {
    $("#textbox1")[0].value = system_status;
});

答案 6 :(得分:2)

要定义基于DOM元素的全局变量,必须检查一些事项。首先,如果代码在<head>部分中,那么DOM将不会在执行时加载。在这种情况下,必须放置一个事件处理程序,以便在加载DOM之后设置变量,如下所示:

var systemStatus;
window.onload = function(){ systemStatus = document.getElementById("system_status"); };

但是,如果此脚本在DOM加载时在页面中内联,则只要有问题的DOM元素已加载到脚本所在的位置上方,就可以完成此操作。这是因为javascript同步执行。这是有效的:

<div id="system_status"></div>
<script type="text/javascript">
 var systemStatus = document.getElementById("system_status");
</script>

作为后一个示例的结果,大多数在正文中运行脚本的页面将它们保存到文档的最后。这将允许页面加载,然后执行javascript,这在大多数情况下会导致更快地呈现DOM。