Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript闭包冻结递增器的值_Javascript_Jquery_Closures - Fatal编程技术网

Javascript闭包冻结递增器的值

Javascript闭包冻结递增器的值,javascript,jquery,closures,Javascript,Jquery,Closures,我很难理解和使用闭包(是的,我读过) 我的问题如下: for (row = 0; row < 10; row++) { for (column = 0; column < 10; column++) { var target = $("#" + Data.Row[row].Column[column].ID); target.mouseenter(function () { var position = Calcul

我很难理解和使用闭包(是的,我读过)

我的问题如下:

for (row = 0; row < 10; row++) {
    for (column = 0; column < 10; column++) {

        var target = $("#" + Data.Row[row].Column[column].ID);

        target.mouseenter(function () {
            var position = CalculatePosition($(this));

            alert("row:" + row + ",column:" + column);

            ...
        });
    }
}

这似乎只适用于列,但当然,这不再是指目标。

这里最简单的选项通常是定义一个返回处理程序的函数:

function getHandler(row, column)
    return function () {
        var position = CalculatePosition($(this));
        alert("row:" + row + ",column:" + column);
        // ...
    };
}
然后在循环中调用此函数,以使处理程序在调用时将相关变量“固定”到其值:

for (row = 0; row < 10; row++) {
    for (column = 0; column < 10; column++) {
        var target = $("#" + Data.Row[row].Column[column].ID);
        target.mouseenter(getHandler(row, column));
    }
}
for(行=0;行<10;行++){
用于(列=0;列<10;列++){
var target=$(“#”+Data.Row[Row].Column[Column].ID);
mouseenter(getHandler(行、列));
}
}
您还可以在循环中,通过立即执行的匿名函数执行此操作:

for (row = 0; row < 10; row++) {
    for (column = 0; column < 10; column++) {
        var target = $("#" + Data.Row[row].Column[column].ID);
        target.mouseenter((function(row, column) {
            return function () {
                var position = CalculatePosition($(this));

                alert("row:" + row + ",column:" + column);

                ...
            };
        })(row, column)));
    }
}
for(行=0;行<10;行++){
用于(列=0;列<10;列++){
var target=$(“#”+Data.Row[Row].Column[Column].ID);
target.mouseenter((函数(行、列){
返回函数(){
var位置=计算位置($(此));
警报(“行:+行+”,列:+列);
...
};
})(行、列));
}
}
但在我看来,这更难看,更难阅读


在任何一种情况下,这里的基本方法都是建立一个新的函数范围,使用循环变量作为参数;现在,当您在处理程序回调中使用它们时,它们不再是对外部作用域变量的引用。

这里最简单的选项通常是定义一个返回处理程序的函数:

function getHandler(row, column)
    return function () {
        var position = CalculatePosition($(this));
        alert("row:" + row + ",column:" + column);
        // ...
    };
}
然后在循环中调用此函数,以使处理程序在调用时将相关变量“固定”到其值:

for (row = 0; row < 10; row++) {
    for (column = 0; column < 10; column++) {
        var target = $("#" + Data.Row[row].Column[column].ID);
        target.mouseenter(getHandler(row, column));
    }
}
for(行=0;行<10;行++){
用于(列=0;列<10;列++){
var target=$(“#”+Data.Row[Row].Column[Column].ID);
mouseenter(getHandler(行、列));
}
}
您还可以在循环中,通过立即执行的匿名函数执行此操作:

for (row = 0; row < 10; row++) {
    for (column = 0; column < 10; column++) {
        var target = $("#" + Data.Row[row].Column[column].ID);
        target.mouseenter((function(row, column) {
            return function () {
                var position = CalculatePosition($(this));

                alert("row:" + row + ",column:" + column);

                ...
            };
        })(row, column)));
    }
}
for(行=0;行<10;行++){
用于(列=0;列<10;列++){
var target=$(“#”+Data.Row[Row].Column[Column].ID);
target.mouseenter((函数(行、列){
返回函数(){
var位置=计算位置($(此));
警报(“行:+行+”,列:+列);
...
};
})(行、列));
}
}
但在我看来,这更难看,更难阅读

在任何一种情况下,这里的基本方法都是建立一个新的函数范围,使用循环变量作为参数;现在,当您在处理程序回调中使用它们时,它们不再是外部范围变量的引用。

您可以这样使用(第一个参数是上下文(
this
arg)):

但是bind不是跨浏览器的,并且您已经在使用jQuery,因此您应该使用:

可以这样使用(第一个参数是上下文(
this
arg)):

但是bind不是跨浏览器的,并且您已经在使用jQuery,因此您应该使用:


不,做了一些你不能在这里使用的不同的事情(也可以阅读)@Bergi他可以使用
bind
比如:
函数(行,列){}.bind(目标,行,列)
。我怀疑你想让函数知道单击了哪个元素,每个元素都有不同的ID。真的吗?@Paulpro:Ah,没有看到他已经知道处理程序外部的
这个
/
目标[0]
。至少对更大的集合不起作用…不,做了一些你不能在这里使用的不同的事情(也可以阅读)@Bergi他可以使用
bind
比如:
function(row,column){}.bind(target,row,column)
。我怀疑你想让函数知道单击了哪个元素,每个元素都有不同的ID。真的吗?@Paulpro:Ah,没有看到他已经知道处理程序外部的
这个
/
目标[0]
。至少对更大的集合不起作用…+1这是通过为循环中的每个迭代创建一个新的闭包来实现的,该闭包也包含mouse-enter处理程序。这样,每个元素的处理程序都有自己存储的x和y值。谢谢!现在,这个解决方案在我的脑海中变得更有意义了。+1这是通过为循环中的每个迭代创建一个新的闭包来实现的,该闭包也包含鼠标输入处理程序。这样,每个元素的处理程序都有自己存储的x和y值。谢谢!这个解决方案现在在我的脑海中变得更有意义了。但是你应该只使用
target[0]
来获取DOM元素,或者从
处理程序中删除
$()
。@Bergi谢谢,我没有注意到
target
是一个jQuery对象(我假设它是某个事件处理程序中的
e.target
)。我已经将其更新为使用
target[0]
。但是您应该使用
target[0]
仅获取DOM元素,或者从处理程序内部的
中删除
$()
。@Bergi谢谢,我没有注意到
target
是一个jQuery对象(我假设它是某个事件处理程序中的
e.target
)。我已将其更新为使用
target[0]