代码之家  ›  专栏  ›  技术社区  ›  Darren

javascript函数变量突然变为未定义?

  •  2
  • Darren  · 技术社区  · 15 年前

    这是最奇怪的事情。我的代码如下:

    function menuSwipe(init){
        dojo.query('div.fill div.container div.menu div.group ul').forEach(function(item){
            dojo.fx.wipeOut({
                node: item,
                duration: 1
            }).play();
            dojo.query('li', item).forEach(function(childrenItem){
                if (dojo.hasClass(childrenItem, 'active')) 
                    childrenItem.parentNode.className = 'items active';
            });
            if (item.className == 'items active') {
    
                dojo.query('div.category', item.parentNode).forEach(function(parentItem){
                    setTimeout(function(){
                        menuOpen(parentItem, init);
                        doGrayscale(parentItem);
                    }, 100);
                });
            }
        });
    }
    

    基本上 init 在进入国际单项体育联合会之前一直留在记忆中 (item.className == 'items active') 有条件的。之后它变成 undefined . 它是我正在设置的布尔值。只要是以前 if (item.className == 'items active') 它将保持其价值。我没有理由这么做。我试过了 this.init = 并将其设置为 var init = init . 是否有人知道或者有什么方法可以在整个函数中保留它的值?它不是初始命名,我尝试了一个不同的名称,但它仍然执行相同的操作。

    谢谢, 戴伦

    1 回复  |  直到 15 年前
        1
  •  2
  •   Guffa    15 年前

    问题是超时是在函数完成后运行的,所以当超时运行时parentItem变量已超出范围。

    在该范围内创建一个局部变量,以便为超时函数创建一个闭包。这样每个迭代都有自己的变量:

    dojo.query('div.category', item.parentNode).forEach(function(parentItem){
      var itemCopy = parentItem;
      window.setTimeout(function(){
        menuOpen(itemCopy, init);
        doGrayscale(itemCopy);
      }, 100);
    });