JavaScript img onLoad 和闭包 - 为什么这段代码会触发无限循环?

标签 javascript google-maps closures

我有一些 Google Maps JS,可以在 map 上绘制许多标记。然而,在加载标记时,我注意到图像没有及时加载,因此没有放置标记。 为了解决这个问题,我修改了返回 map 标记的函数,如下所示:

function newGoogleMapPin(type){
    var imgpath = "img/gmapicons/"+type+".png";
    var img = new Image();
        img.src = imgpath;
    var imgloaded = false;

    while(imgloaded == false) {
        img.onload = function() {
            imgloaded = true;
        }
    }

    return new google.maps.MarkerImage(imgpath, new google.maps.Size(img.width, img.height));
}

问题是imgloaded从未设置为true, 我对闭包有什么误解吗? (我想是的!)

最佳答案

您必须记住,JavaScript 本质上是单线程的,并且这个单线程实际上是在 JavaScript 执行和浏览器渲染之间共享的。因此,您的 while 循环将阻塞线程,并且将永远循环。

while(imgloaded == false) {
    // onload will never get called:
    img.onload = function() {
        imgloaded = true;
    }
}

关于JavaScript img onLoad 和闭包 - 为什么这段代码会触发无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3468920/

相关文章:

快速将 Any 转换为闭包

javascript - CSS max() 函数替代

javascript - 使用 jsPDF 和 html2canvas 将具有属性 "hidden"的 div 转换为 pdf

jquery - 使用 Google map api 时出现 "gmap is not a function"

google-maps - 如何使用 flutter 的 google_maps 插件获取可见 map 的范围?

java - 重用 Java 的闭包/匿名类来提高性能?

javascript - 如何使用 JSON 和 vanilla JavaScript 制作多语言网站

带有音频和粒子的 Javascript 开源手机游戏引擎?

javascript - 从 mysql 检索纬度和经度,将其传递给谷歌地图 api

java - 什么是闭包? java有闭包吗?