javascript - For 循环函数,意外的输出 - 始终相同

标签 javascript jquery loops

我遇到了这种奇怪的情况,我不知道为什么输出不是我所期望的。这只是一个简单的for循环函数。有人可以解释一下为什么会发生这种情况吗?

var pm = 2; 
for (var i = 0; i < pm; i++) {
     $("#specialty_pm_"+i).mouseenter(function(){
            alert(i);
    });
};

我的 html 中有 2 个 div,其中有 id="specialty_pm_<?php echo $countPM; ?>"该 div 位于 php 中的 for 循环函数内。 foreach ($employee_info as $emp_info){ $countPM++; } 我希望第一个 div 中的悬停警报为“1”,第二个 div 中的警报为“2”。但是当我将鼠标悬停在第一个 div 时,它会提醒“2”。

最佳答案

你应该使用 JavaScript 闭包:

var pm = 2; 
for (var i = 0; i < pm; i++) {
    var func = (function(i){
        return function(){
            alert(i);
        }
    })(i);
    $("#specialty_pm_"+i).mouseenter(func);
};

重点是在您的代码中,所有 mouseenter 函数都使用相同的变量 i,并且在循环结束后,它的最后一个值是 2。使用作用域链以及 JavaScript 中的嵌套函数及其闭包,您可以为变量创建安全作用域。基本上,嵌套函数的作用是为内部函数提供外部词法环境。您可以在这篇文章中找到更多信息:

Scope Chain in Javascript .

关于javascript - For 循环函数,意外的输出 - 始终相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22119724/

相关文章:

javascript - 使用 Hapi 和异步的 API - 如何清空数组/在 "reply"之后或在每个新的 "get"处立即执行某些操作?

javascript - addEventListener ("click",...) 立即触发

jquery - 在 firefox 中为固定位置居中的 div 设置动画时如何防止 jquery 动画水平位置跳跃

python - 是否可以有一个没有循环的进度条?

Javascript 菜单类切换

javascript - d3js :The xaxis time is not showing the complete date value

javascript - 带有 Bootstrap 主题的 Mottie 虚拟键盘

jquery - 单击时,隐藏 div 并删除所需的属性

r - 循环 - 替换的长度为零

r - R 中的两个 for 循环