javascript - for 循环中的粘性/静态变量引用

标签 javascript jquery

在此示例中,我创建了三个按钮“一”“二”“三”。单击时我希望他们提醒他们的号码:

<html>
    <head>
        <script type="application/javascript" src="jquery.js"></script>
        <script type="application/javascript">
            $(document).ready(function() {
                var numbers = ['one', 'two', 'three'];
                for (i in numbers) {
                    var nr = numbers[i];
                    var li = $('<li>' + nr + '</li>');
                    li.click(function() {
                        var newVariable = String(nr);
                        alert(i); // 2
                        alert(nr); // three
                        alert(newVariable); // three
                        alert(li.html()); // three
                    });
                    $('ul').append(li);
                }
            });
        </script>
    </head>
    <body>
        <ul>
        </ul>
    </body>
</html>

问题是,当单击其中任何一个时,将使用循环变量的最后一个值,即警报框始终显示“三”。

在 JavaScript 中,for 循环内的变量在 C 语言意义上似乎是“静态”的。 是否有某种方法可以为每个点击函数创建单独的变量,即不使用相同的引用?

谢谢!

编辑:

解决方案是使用 jQuery.data将任意数据与每个元素关联:

<html>
    <head>
        <script type="application/javascript" src="jquery.js"></script>
        <script type="application/javascript">
            $(document).ready(function() {
                var numbers = ['one', 'two', 'three'];
                for (i in numbers) {
                    var nr = numbers[i];
                    var li = $('<li>' + nr + '</li>');
                    li.data('nr', nr);
                    li.click(function() {
                        alert($(this).data('nr'));
                    });
                    $('ul').append(li);
                }
            });
        </script>
    </head>
    <body>
        <ul>
        </ul>
    </body>
</html>

最佳答案

或者,在 for 循环内放置一个闭包。

        $(document).ready(function() {
            var numbers = ['one', 'two', 'three'];
            for (i in numbers) {
                (function () {
                var nr = numbers[i];
                var li = $('<li>' + nr + '</li>');

                li.click(function() {
                    var newVariable = String(nr);
                    alert(i); // 2
                    alert(nr); // three
                    alert(newVariable); // three
                    alert(li.html()); // three
                });

                $('ul').append(li);

                }());
            }
        });

使用 for in 迭代数组也是不好的做法。它应该严格用于迭代对象字段。请改用 for(;;;)

关于javascript - for 循环中的粘性/静态变量引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2570763/

相关文章:

javascript - 如何在 JSDoc for Visual Studio intellisense 中记录回调参数?

javascript - 为多个页面上的导航栏创建可重用的 html

javascript - 使用 cmd 键在新选项卡中打开链接?

javascript - jquery if else 语句不起作用

javascript - 单击一个时切换/关闭所有其他 div

c# - Asyncpostback 时 UpdatePanel 中的 SelectPicker 消失

javascript - 使用javascript将文本文件发送到服务器

javascript - 如何正确对齐出现在日期选择器文本框下方的日期选择器图标?

javascript - 在 JavaScript 中将标签应用于多维数组中的对象

javascript - 在刷新页面上保留数据