2010-10-28 24 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