Javascript :: this.value在for循环中无法正常工作?

时间:2015-04-05 14:21:25

标签: javascript arrays this settimeout onmousedown

我的代码几乎可以说明我将要实现的目标,但只是为了澄清......

我希望在长按(mousedown为200ms)后返回输入值。

它完全在for循环之外工作,但在循环内部似乎没有。

对于this.value,它返回undefined,对于gangina[i].value,它没有返回任何内容。

这是jsFiddle:

http://jsfiddle.net/hezi_gangina/nxao19oc/

这是我的代码:

<input type=button value=1>
<input type=button value=2>

<script>

var hezi;
var gangina=document.getElementsByTagName("input");

alert(gangina[1].value); //THIS IS OK! :)

for(i=0;i<gangina.length;i++)
{

    gangina[i].onmousedown=function()
    {
        hezi=setTimeout
        (
            function()
            {
                alert('this = '+this.value); // = undefined
                alert('gangina['+i+'] = '+gangina[i].value); // = nothing
            },200
        );
    }

}

</script>

这里需要小调整......

1 个答案:

答案 0 :(得分:1)

<强> DEMO

您可能需要将函数包装在IIFE中,该函数将绑定i值。

由于内部mousedown事件处理程序将在某个时刻执行,它将只记住i的最后一个值。另请注意,您也忘了在我面前提及var

如果要分配正确的i值,最好将内部函数包装在IIFE函数中,现在该事件处理程序将引用当前作用域i。因此,它将始终记住i的正确值。

for(var i=0;i<gangina.length;i++)
{
   (function(i) {
    gangina[i].onmousedown=function()
    {
        var that = this;
        hezi=setTimeout
        (
            function()
            {
                alert('this = '+that.value); // = undefined
                alert('gangina['+i+'] = '+gangina[i].value); // = nothing
            },200
        );
    }
  })(i);

}

同样在setTimeout内,this将引用Window对象而不是DOM元素。