关于javascript关闭的小问题

时间:2011-02-11 02:34:37

标签: javascript closures

我想更改元素的宽度以进行简单的动画 这是代码:

function mysildeDown(elem) {
    var fullw = parseInt(getStyle(elem, 'width'));

    elem.style['width'] = 0;

    for (var j=0; j < 100; j++) {
        (function () {
            **var i=j;**
            setTimeout(function () {
                elem.style['width'] = (i / 100) * fullw + 'px';
            }, (i + 1) * 10 );
        })();
    }
}

// GetStyle函数没问题 我想知道为什么我应该使用var i = j,非常感谢

3 个答案:

答案 0 :(得分:2)

通常在循环内部执行此类操作,并在另一个函数中使用j的值时,该函数始终以j的最后一个值结束。因此,您需要找到一种方法来使用j的值,就像在循环中创建该函数时那样。

我通常看到的方法是将其作为参数传递给立即调用的函数,如下所示。

function mysildeDown(elem){
  var fullw=parseInt(getStyle(elem,'width'));

  elem.style['width']=0;
  for(var j=0;j<100;j++){
    (function(i){
      setTimeout(function(){
        elem.style['width']= (i/100)*fullw+'px';
      },(i+1)*10)
    })(j);
  }
}

答案 1 :(得分:0)

在javascript中定义变量时使用var关键字在当前代码行的范围内声明它。在您的特定情况下,如果您在声明变量var时没有使用i关键字,那么i将是全局的,可能会导致问题,因为它在for中非常常见循环。

通过在函数内部使用var关键字,您的变量i是函数的本地变量,并且在该函数的范围之外无法访问。

有一些好消息here

答案 2 :(得分:0)

因此,在调用setTimeout时,我将在计时器函数中具有j的值。基本上,您存储定时器触发时要使用的j的值。