首页 > web前端 > js教程 > 正文

如何在 JavaScript 闭环循环中访问外部变量?

Mary-Kate Olsen
发布: 2024-10-20 08:56:02
原创
337 人浏览过

How to Access an Outside Variable within a JavaScript Closure Loop?

从 JavaScript 闭包中访问循环中的外部变量

在 JavaScript 中,当使用 for 循环迭代数组时,很常见循环内变量的值始终与上次迭代相同的问题。这是由于可变作用域和闭包造成的。

为了解决这个问题,可以采用一种称为闭包的技术。闭包是一个返回函数的函数,它捕获父函数的变量范围。

考虑以下示例:

<code class="javascript">for (var i in this.items) {
    var item = this.items[i];
    $("#showcasenav").append("<li id=\"showcasebutton_" + item.id + "\"><img src=\"/images/showcase/icon-" + item.id + ".png\" /></li>");
    $("#showcasebutton_" + item.id).click(function() {
        alert(item.id);
        self.switchto(item.id);
    });
}</code>
登录后复制

在这段代码中,变量项随着每次变化而变化。循环的迭代。当调用点击处理程序时,它使用 item 的最后一个值。

为了解决这个问题,我们可以使用闭包来捕获循环变量的范围:

<code class="javascript">for (var i in this.items) {
    var item = this.items[i];
    $("#showcasenav").append("<li id=\"showcasebutton_" + item.id + "\"><img src=\"/images/showcase/icon-" + item.id + ".png\" /></li>");
    $("#showcasebutton_" + item.id).click(
        // create an anonymous function that will scope "item"
        (function(item) {
            // that returns our function
            return function() {
                alert(item.id);
                self.switchto(item.id);
            };
        })(item) // immediately call it with "item"
    );
}</code>
登录后复制

这里,我们将点击处理函数包装在另一个函数中,该函数在循环迭代期间捕获 item 的范围。当调用单击处理程序时,它会使用正确的 item 值。

另一种方法是使用 jQuery 的 $.each() 函数,该函数会自动获取循环变量,从而无需闭包:

<code class="javascript">$.each(this.items, function(i, item) {
    $("#showcasenav").append("<li id=\"showcasebutton_" + item.id + "\"><img src=\"/images/showcase/icon-" + item.id + ".png\" /></li>");
    $("#showcasebutton_" + item.id).click(function() {
        alert(item.id);
        self.switchto(item.id);
    });
});</code>
登录后复制

以上是如何在 JavaScript 闭环循环中访问外部变量?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!