Javascript can';t访问外部函数中的变量

Javascript can';t访问外部函数中的变量,javascript,variables,Javascript,Variables,为什么我不能让这个变量通知imgWidth?请注意,我没有在子函数中设置var,但在父函数中,当我向imgWidth发出警报时,它返回未定义?,因为这一行执行后img加载警报(imgWidth) 解决方案是移动警报(imgWidth)在onload功能内 var _URL = window.URL || window.webkitURL; var $file = FS.gID('failImage'); var imgSize = FS.gID('failImage'); var file

为什么我不能让这个变量通知imgWidth?请注意,我没有在子函数中设置var,但在父函数中,当我向imgWidth发出警报时,它返回未定义?

,因为这一行执行后img加载
警报(imgWidth)

解决方案是移动
警报(imgWidth)
onload
功能内

var _URL = window.URL || window.webkitURL;

var $file = FS.gID('failImage');

var imgSize = FS.gID('failImage');

var file, img, imgWidth, imgHeight;


if(file = imgSize.files[0]) {

 img = new Image();

    img.onload = function() {

        imgWidth = this.width;
        imgHeight = this.height;


    }

    img.src = _URL.createObjectURL(file);

}

 alert(imgWidth); //Comes out undefined.
或者使用回调函数

if (file = imgSize.files[0]) {

    img = new Image();

    img.onload = function () {

        imgWidth = this.width;
        imgHeight = this.height;

        alert(imgWidth); // This should work

    }

    img.src = _URL.createObjectURL(file);

}

因为onload是异步的-因为onload是异步函数,所以它不会按顺序执行。如果你把警报放在onload中,你会得到这个值。没有其他方法可以让我在父函数中发出警报。我问这个问题是因为我想把宽度和高度与我的另一个检查一起放在脚本的底部。所以,如果我能写出if(imgWidthalert
作为解释的例子。无论如何,您可以在
afterLoad
功能中比较代码。例如:
函数afterLoad(width,height){if(imgWidth
是的,问题是如果我把它放在afterLoad()中,那么afterLoad子项是唯一可以访问宽度和高度的子项。我只想能够在父函数中设置imgWidth和imgHeight。但由于必须使用onload,我不得不将其放入子函数中。只是想弄清楚如何将结果传回父函数。@JonW“我只是想在父函数内设置imgWidth和imgHeight”您不能这样做。@JonW依赖于
onload
函数内容的所有代码都应该在它里面。(it=
onload
函数)
function afterLoad(width, height) {
    alert(width);
    alert(height);
}

if (file = imgSize.files[0]) {

    img = new Image();

    img.onload = function () {

        imgWidth = this.width;
        imgHeight = this.height;

        afterLoad(imgWidth, imgHeight);

    }

    img.src = _URL.createObjectURL(file);

}