Javascript变量有时未定义

时间:2012-05-17 23:25:02

标签: javascript html

我知道这个问题已被问过好几次了,但我似乎找不到一个在以前的任何问题中对我有用的解决方案。当我的HTML页面加载完成后,我有一个变量被设置,但有时当我的代码试图访问该变量时,它表示它是未定义的。我不知道为什么,因为我相信我正在等待一切正常加载。这种异常似乎是随机发生的,因为大多数时候所有代码都运行正常。这是我的代码的简化版本:

var globalVar;

function initStuff(filePath) {
    // I wait till the HTML page is fully loaded before doing anything
    $(document).ready(function(){
        var video = document.getElementById("videoElementID");

        // My parseFile() function seems to run smoothly
        var arrayOfStuff = parseFile(filePath); 

        if (arrayOfStuff == null) {
            console.error("Unable to properly parse the file.");
        } else {
            setGlobalVariable(arrayOfStuff);
            video.addEventListener("play", updateVideoFrame, false);
        }
    });
}

function setGlobalVariable(arrayOfStuff) {
    window.globalVar = arrayOfStuff;
}

function updateVideoFrame() {
    // A bunch of other code happens first

    // This is the line that fails occasionally, saying 
    // "window.globalVar[0].aProperty.anArray[0] is undefined"
    var test = window.globalVar[0].aProperty.anArray[0].aProperty;
}

我能想到的唯一可能导致这个问题的是某种同步性问题。但我不明白为什么会这样。求救!

编辑:

如果异步问题来自我的parseFile(xmlFile)方法,这就是我在那里做的事情。我认为它不可能导致问题,因为我强制方法同步发生,但如果我错了,这里是:

function parseKML(xmlFile) {
    var arrayOfStuff = new Array();

    // Turn the AJAX asynchronicity off for the following GET command
    $.ajaxSetup( { async : false } );
    // Open the XML file
    $.get(xmlFile, {}, function(xml) {
        var doc = $("Document", xml);   
        // Code for parsing the XML file is here
        // arrayOfStuff() gets populated here
    });

    // Once I'm done processing the XML file, I turn asynchronicity back on, since that is AJAX's default state
    $.ajaxSetup( { async : true } );

    return arrayOfStuff;
}

2 个答案:

答案 0 :(得分:2)

你应该在你的代码中做的第一件事是弄清楚:

的哪一部分
window.globalVar[0].aProperty.anArray[0]

未定义。

由于您有多个链式属性引用和数组引用,因此链中可能有许多不同的位置。我建议在你的引用之前设置一个断点,它会检​​查它中的内容,或者使用几个console.log()语句来输出结构的每个嵌套部分,以便找出你的问题所在。

console.log("globalVar = " + globalVar);
console.log("globalVar[0] = " + globalVar[0]);
console.log("globalVar[0].aProperty = " + globalVar[0].aProperty);
console.log("globalVar[0].aProperty.anArray = " + globalVar[0].aProperty.anArray);
console.log("globalVar[0].aProperty.anArray[0] = " + globalVar[0].aProperty.anArray[0]);

如果问题是globalVar尚未设置,那么您有计时问题或初始化问题。

如果问题是未设置其他属性之一,那么您没有使用您认为的初始化globalVar。

您可能还希望以更具防御性的方式编写代码,以便在未正确设置某些数据时优雅地失败。

答案 1 :(得分:1)

你需要使用防御性编程。 http://www.javascriptref.com/pdf/ch23_ed2.pdf

示例:

var video = document.getElementById("videoElementID") || 0;

-

if( video && video.addEventListener ){
    video.addEventListener("play", updateVideoFrame, false);
}

这是您的代码的另一个版本。

window.globalVar = globalVar || [];
function setGlobalVariable(arrayOfStuff) {
    window.globalVar = arrayOfStuff;
}
function updateVideoFrame() {
    // A bunch of other code happens first

    // This is the line that fails occasionally, saying
    // "window.globalVar[0].aProperty.anArray[0] is undefined"
    if( window.globalVar ){
        var g = window.globalVar || [];
        var d = (g[0] || {})["aProperty"];
        // etc...
    }else{
        console.error( "test error." );
    }

}
function initStuff(filePath) {
    // I wait till the HTML page is fully loaded before doing anything
    $(document).ready(function () {
        var video = $("#videoElementID");

        // My parseFile() function seems to run smoothly
        var arrayOfStuff = parseFile(filePath) || [];

        if (arrayOfStuff == null || video == null ) {
            console.error("Unable to properly parse the file.");
        } else {
            setGlobalVariable(arrayOfStuff);
            video.bind("play", updateVideoFrame);
        }
    });
}