在子函数中访问循环迭代?

2024-01-02

我正在使用 Google Maps API 在地图上绘制多个点。然而,在下面的点击事件函数中,i始终设置为 4,即迭代循环后的值:

// note these are actual addresses in the real page
var addresses = new Array( "addr 1", "addr 2", "addr 3", "addr 4" );

for (var i = 0; i < addresses.length; i++) {
    geocoder.getLatLng(addresses[i], function(point) {
        if (point) {
            var marker = new GMarker(point);
            map.addOverlay(marker);
            map.setCenter(point, 13);

            GEvent.addListener(marker, "click", function() {
                // here, i=4
                marker.openInfoWindowHtml("Address: <b>" + addresses[i] + "</b>");
            });
        }
    });
}

因此,当标记显示时,它正在使用addresses[4]这是未定义的。我如何传递正确的值i到函数?


您需要在当前迭代期间生成一个匿名函数,以下应该修复它:

// note these are actual addresses in the real page 
var addresses = new Array( "addr 1", "addr 2", "addr 3", "addr 4" ); 

for (var i = 0; i < addresses.length; i++) { 
    geocoder.getLatLng(addresses[i], function (current) { 
        return function(point) { 
            if (point) { 
                var marker = new GMarker(point); 
                map.addOverlay(marker); 
                map.setCenter(point, 13); 

                GEvent.addListener(marker, "click", function() { 
                    // here, i=4 
                    marker.openInfoWindowHtml("Address: <b>" + addresses[current] + "</b>"); 
                }); 
            }
        } 
    }(i)); 
} 

B//注意这些是真实页面中的实际地址 var 地址 = new Array( "addr 1", "addr 2", "addr 3", "addr 4" );

for (var i = 0; i

        GEvent.addListener(marker, "click", function() { 
            // here, i=4 
            marker.openInfoWindowHtml("Address: <b>" + addresses[i] + "</b>"); 
        }); 
    } 
}); 

}

进一步澄清
The getLatLngGoogle 提供的方法使用 ajax 调用来获取特定地址的纬度和经度。由于这是一个异步调用并且不是当前线程的一部分,因此需要一个回调函数,该函数在 ajax 请求完成时调用。这是您指定为函数的第二个参数的匿名函数。
现在,在发出 ajax 请求的同时,您的代码继续运行,从而增加了i每次循环遍历数组时。当您的第一个 ajax 调用返回时,循环已经增加到地址数组的长度 (4),因此当您的回调函数运行时,您将检索范围内的变量i在它被循环增加之后。

通过我编写的修复程序,您将创建一个带有单个参数的匿名函数 -current- 并返回前一个匿名函数i变量替换为current多变的。在循环的下一次迭代之前立即调用该函数,其中i变量作为它的第一个参数。这将创建一个闭包,其当前值i存储在current调用函数时的变量。当我们提到current变量稍后,我们得到存储的值i.

我不太擅长解释这类事情,可能是因为我对它的理解不如js大神。更好地阅读有关 javascript 闭包的更多信息 http://www.jibbering.com/faq/faq_notes/closures.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在子函数中访问循环迭代? 的相关文章

随机推荐

  • 将文本文件中的内容加载到 sqlite 表中?

    我有只包含普通文本的简单文本文件 我想知道是否有一种方法可以将文本内容加载到 sqlite 中的表中 所以也许我可以Create table myTable nameOfText TEXT contents TEXT 然后把nameOfTe
  • 将元素从一个数组移动到另一个数组

    我尝试过以下操作斯塔克闪电战 https stackblitz com edit ng2 dragula base uabwzg file src 2Fapp 2Fapp component ts哪个使用ng2 dragula 我的问题在于
  • 将更改提交到 Git 中的多个分支

    典型使用场景 我有master branch foo 和branch bar 全部都是最新的 现在 我做了一个 git checkout master 并致力于错误修复 假设修复是在所有分支上处于相同状态的跟踪文件上 即 在修复之前 每个分
  • 需要帮助理解 CSS 选择性规则

    div a href class bar span class baz TEXT span a div 我是 CSS 菜鸟 但我的直觉告诉我a b
  • 返回脚本中使用的导入 Python 模块的列表?

    我正在编写一个程序 根据导入的模块对 Python 文件列表进行分类 因此 我需要扫描 py 文件的集合并返回它们导入的模块的列表 例如 如果我导入的文件之一包含以下行 import os import sys gtk 我希望它返回 os
  • 递归地从字符串中删除重复的字符

    我需要帮助来弄清楚如何从字符串中删除重复的字符 它必须递归地完成 这才是真正的问题 public class FEQ2 param args public static void removeDups String s int firstC
  • 如何旋转 TextView 而不剪切其边界?

    我正在尝试旋转我的子类TextView using canvas rotate canvas save final int w getWidth final int h getHeight float px w 2f float py h
  • 下载文件 - VB6

    有谁知道如何下载文件 无需打开网页 并将其保存到 Visual Basic 6 0 中的目录中 如果您只想使用代码 无互联网传输控制 来完成此操作 VBNet mvps org http vbnet mvps org index html
  • 获取 CultureInfo 中的当前语言

    如何使用识别操作系统的语言CultureInfo 例如 如果Windows中的语言设置为法语 我需要识别法语并加载fr资源文件数据 我认为这样的东西会给你当前的 CultureInfo CultureInfo currentCulture
  • Google + 登录按钮被阻止的框架

    我一直在尝试建立一种你好世界使用 Google 登录的项目 我按照教程进行操作https developers google com web signin https developers google com web signin 我的
  • Chrome`位置:固定;底部:0;`被 Android UI 遮挡

    我在 Android Chrome 上遇到以下代码问题 导航栏覆盖了页面底部的元素 test position fixed bottom 0 width 100 background red 桌面版 Chrome 正确 安卓浏览器 这是演示
  • 是否可以在管理面板中限制模型的对象创建?

    我只是想知道是否可以在管理面板中限制模型的对象数量 例如 我有一个名为 主页 的模型 在管理面板中我不希望用户可以创建多个主页实例 我有办法做到这一点吗 如果您只想影响管理员 并且不想影响数据库模型 则可以创建自定义 ModelAdmin
  • 无法从我的 App Engine 访问 Google Cloud SQL 数据库

    上周我尝试为 NodeJS API 和 Cloud SQL 数据库设置 Google Cloud 总体而言 它工作正常 但我无法访问我的 Cloud SQL 数据库 SQL数据库的授权表明当前项目内的所有应用都有权访问该数据库 不幸的是 事
  • focusout 事件后未触发单击事件

    Focusout事件之后 不再触发click事件 我的设计是
  • 创建 torrent 哈希信息

    如何在 torrent 文件上生成 torrent 哈希信息 我一直在看这个例子 如何使用 Java 计算 torrent 的哈希值 https stackoverflow com questions 3436823 how to calc
  • Mac OS X 雪豹上的 ant 默认安装在哪里?

    我没有设置ANT HOME 所以我想找到ant的主目录在哪里 我使用的是 OSX 安装中默认安装的 ant 版本 按照以下说明查找任何包的位置 whereis ant replace ant with whatever you re loo
  • 解析时 JSON 中位置 608 处出现意外字符串

    我正在尝试将我的 React 网站托管到 GitHub 但是当我尝试使用时 npm install save gh pages 我收到以下错误 Failed to parse json npm ERR JSON parse Unexpect
  • 为什么我的 Tkinter 饼图不显示?

    我正在构建一个应用程序 它接受输入 将其保存到 CSV 文件 现在最后一个基本部分是显示列内容的饼图 输入应该是关于书籍的 因此 饼图应该显示列表中所有书籍的类型 我在创建饼图时没有问题 我在单独的脚本中管理它 我也没有收到错误消息 但只有
  • JSF 转换标题属性的日期

    我需要将日期放入图像的标题属性中 以便当用户将鼠标悬停在图像上时显示该日期 问题是我想更改日期格式 有任何想法吗
  • 在子函数中访问循环迭代?

    我正在使用 Google Maps API 在地图上绘制多个点 然而 在下面的点击事件函数中 i始终设置为 4 即迭代循环后的值 note these are actual addresses in the real page var ad