2009-09-28 170 views
0

我有以下幾點:某處失去了變量?

var element = $(this); 
var divName = element.parents("div:eq(0)").attr("name"); 
$.each(boxInfo,function(i,n) { 
    if(n.boxName == divName) 
    { 
     var newHeight = n.boxHeight; 
    } 
}); 

clicked.parents("div:eq(0)").animate({ 
    height: newHeight + 'px' 
}, 1000); 

問題是 「newHeight未定義」。但如果我這樣做:

var element = $(this); 
var divName = element.parents("div:eq(0)").attr("name"); 
$.each(boxInfo,function(i,n) { 
    if(n.boxName == divName) 
    { 
     alert(n.boxHeight); 
     var newHeight = n.boxHeight; 
    } 
}); 

clicked.parents("div:eq(0)").animate({ 
    height: newHeight + 'px' 
}, 1000); 

它返回高度。這個變量的5行是如何定義的?

回答

4

您的名爲newHeight的變量在匿名函數(作爲參數傳遞給$.each)中聲明。這意味着它的價值僅在該匿名函數中可用。這個概念被稱爲scope。它解釋了爲什麼你的變量在匿名函數之外是未定義的。

如果您更改了代碼以在更廣的範圍內聲明該變量,那麼您的代碼將按照您的預期行事。觀察:

var element = $(this); 
var divName = element.parents("div:eq(0)").attr("name"); 
var newHeight; 
$.each(boxInfo,function(i,n) { 
    if(n.boxName == divName) 
    { 
     newHeight = n.boxHeight; 
    } 
}); 

clicked.parents("div:eq(0)").animate({ 
    height: newHeight + 'px' 
}, 1000); 
0

newheight的範圍僅限於您應用於每個boxinfo的匿名函數。你需要在newheight之前移除var使其成爲全局變量。

也,你的代碼是不是有效,因爲它可能是因爲你似乎是使用每個()做一些事情,jQuery的能爲你做的,例如,$(boxInfo).find('[boxName=' + divName + ']')

+0

你覺得什麼jQuery不會在幕後?至少用'.each',一旦找到它就可以將回路短路 – nickf 2009-10-19 10:22:48