Javascript变量还原为原始变量

Javascript变量还原为原始变量,javascript,Javascript,所以我有这段代码。我有一个名为imgtemp的全局变量,但每次我在if(inMask)块中设置它时,调用start()时,它都会恢复为未定义。为什么会这样 首先调用loadAll(),然后调用start()。我可以确认,在loadAll()中调用start()的代码执行时,imgtemp已经返回到未定义状态 提前谢谢 这是因为loadAll变为异步,并在加载任何内容之前返回,所以当您调用start时,尚未设置映像。你将需要“链接”它们,而不是单独调用它们 仅调用loadAll(),然后在load

所以我有这段代码。我有一个名为
imgtemp
的全局变量,但每次我在
if(inMask)
块中设置它时,调用
start()
时,它都会恢复为未定义。为什么会这样

首先调用loadAll(),然后调用start()。我可以确认,在loadAll()中调用start()的代码执行时,imgtemp已经返回到未定义状态


提前谢谢

这是因为loadAll变为异步,并在加载任何内容之前返回,所以当您调用start时,尚未设置映像。你将需要“链接”它们,而不是单独调用它们

仅调用loadAll(),然后在loadAll中添加一个事件处理程序,用于加载映像,该映像在加载时调用start()函数

function loadAll() {
    var zip64;
    var zipURL = 'settings/Images.zip';
    var xhr = new XMLHttpRequest();
    xhr.open('GET', zipURL, true);
    xhr.responseType = 'arraybuffer';
    xhr.onload = function() {
        if (this.status == 200) {
            var responseArray = new Uint8Array(this.response);
            var d = responseArray.length;
            var binaryString = new Array(d);

            while (d--) {
                binaryString[d] = String.fromCharCode(responseArray[d]);
            }

            var data = binaryString.join("");
            zip64 = window.btoa(data);

            zip.createReader(new zip.Data64URIReader(zip64), function(reader) {
                reader.getEntries(function(entries) {
                    z = 0;
                    zloopid = setInterval(function() {
                        if (z >= entries.length || !entries[z]) {
                            clearInterval(zloopid);
                            reader.close();
                            start();
                            return;
                        }

                        if (entries[z].filename.split("/")[0] == "__MACOSX") {
                            z++;
                            return;
                        }

                        $("#loadimg").html("Loading " + entries[z].filename + ".... (" + (z + 1) + " of " + entries.length + ")");

                        var isMask = (entries[z].filename.replace(/^.*[\\\/]/, '') == "mask.jpg");

                        entries[z].getData(new zip.Data64URIWriter(), function(uri) {
                            if (isMask) {
                                imgtemp = new Image();
                                imgtemp.src = uri;
                            }
                            else {
                                var lol = new Image();
                                lol.src = uri;
                                imageLibrary.push(lol);
                            }
                        });

                        z++;
                    }, 0);
                });
            }, function(error) {
                window.location = "error.html?err=Error by unzipper: " + error + " (Problem in Images.zip)";
            });
        }
        else {
            window.location = "error.html?err=Error while retrieving zip file (" + zipURL + ") : " + this.status;
        }
    };
    xhr.send();
}

function start() {
    var image = imgtemp;
    width = image.width;
    height = image.height;
/*snip*/
条目[z].getData(新zip.Data64URIWriter(),函数(uri){
如果(isMask){
imgtemp=新图像();
imgtemp.onload=函数(事件){

开始()/*我认为您需要共享调用
start
和调用
loadAll
的时间。我是说事件…另外,您必须检查是否有其他东西正在调用其他函数以使其未定义…您是否在函数中放置了
调试器;
关键字并尝试使用Developer进行调试Toolbar@NaveedButt、 我编辑了答案。试着在
loadAll
start
的开头放一个
debugger;
关键字,看看每个函数调用了多少次……在loadAll()中设置imgtemp之前调用了start()。问题是我不想加载start()加载imgtemp后,因为掩码图像可能不是唯一的图像。@ihsoyih只需计算要加载的图像数,当您有总数时,请调用start:)
/* snip */
entries[z].getData(new zip.Data64URIWriter(), function(uri) {
    if (isMask) {
        imgtemp = new Image();
        imgtemp.onload = function(event) {
            start(); /* <--- HERE  */
        }
        imgtemp.src = uri;
    }
    else {
/* snip */