2010-10-28 68 views
2

这是最奇怪的事情。我的代码如下:Javascript函数变量突然变得不确定了?

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。有没有人知道或有某种方式可以在整个功能中保留其价值?它不是init的命名,我尝试了一个不同的名字,它仍然做同样的事情。

感谢, 达伦

+0

您没有使用可变'init'任何地方,所以我不知道你是如何发现这是未定义或将怎么回事。这里有什么缺失吗? – Chuck 2010-10-28 23:42:23

+0

嗨我修复它应该在哪里,忘记回滚一些修改。 – Darren 2010-10-28 23:43:42

+0

调用'menuSwipe'时'init'的值和'menuOpen'看起来像/用'init'做了什么? – lincolnk 2010-10-29 01:26:32

回答

2

的问题是,该功能完成后超时运行,所以parentItem变量超出范围时暂停运行。

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

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

呃?我不确定这与Darren的问题有什么关系(init神秘地成为未定义的)。我也不知道你的答案会解决什么问题,关于setTimeout的回调关闭是从forEach的回调创建的... – Angiosperm 2010-10-29 00:08:10

+0

我不明白这个...... parentItem已经在闭包中可用,不是你只是使另一个指针已经是本地的参数? – 2012-01-10 22:42:26