将全局变量声明和定义为函数结果有时可行吗?

时间:2015-11-11 18:43:23

标签: javascript

我曾经使用的一些编程语言对于将全局变量设置为函数的结果非常繁琐,所以我习惯在main()或init()中执行它。 / p>

这是由一位朋友寄给我的,令我惊讶的是,它在我的电脑和她的电脑本地完全正常,但在我们的任何一台服务器上都无法工作:

select distinct on (name) *
from (
    select name, loca, locb, count(*) as total
    from Table1
    where loca is not null and locb is not null
    group by 1,2,3
) s
order by name, total desc

然而,奇怪的是,这适用于服务器以及本地:

function getValue(val) {
    return document.getElementById(val);
}
var myValue = getValue("output"); // is this kosher?
function init() {
    myValue.innerHTML = "foo"; //error: myValue is null
    //document.getElementById("output").innerHTML="bar"; //this works though
}
window.onload = init

我通过这样做来修复它:

function getValue(val) {
    return val;
}
var myValue = getValue("output");
function init() {
    alert(myValue);
}
window.onload = init;

...但是现在我很困惑,为什么第二个代码块在第一个代码块不起作用时会起作用。在HTML文档有时间在服务器上加载之前,它是否与运行声明的JS有关?

仅供参考,文件如下:

function getValue(val) {
    return document.getElementById(val);
}
var myValue; // don't set the value here
function init() {
    myValue = getValue("output"); // but here instead
    myValue.innerHTML = "foo"; // this is fine
}
window.onload = init

2 个答案:

答案 0 :(得分:2)

在第一个区块中,您尝试在 dom(html本身)完全渲染和初始化之前获取元素。这就是为什么第三个块可以工作,因为你在window.load上得到它,这个事件在 html初始化之后运行

第二个块可以工作,因为它只是一个字符串,所以没问题。

在这里你的"输出"元素还没有存在。因此myValue将设置为null

var myValue = getValue("output"); 

这就是nullwindow.load的原因。

答案 1 :(得分:1)

在第一个代码块中,运行代码以立即获取doc元素。所以元素还没有存在。由于您在第二个块上获取init方法中的元素,该元素在DOM准备就绪时运行,因此该元素现在存在。

如果您在HTML之后加载JS脚本(也就是说,在标记的最底部),您的第一个块将会运行,因为在运行脚本之前DOM元素存在。