JavaScript не имеет области видимости блока, поэтому значения тех переменных, которые вы объявляете в цикле for, меняются на каждой итерации, и все эти функции ссылаются на одни и те же переменные. Хитрость заключается в том, чтобы создать новую область действия функции в цикле for, чтобы объявленные вами переменные были связаны во время этой итерации.
Вы можете сделать это, выполнив анонимную функцию внутри цикла:
menuMouseOver = function() {
for(i=0, u=arguments.length; i<u; i++){
(function(){ // anonymous function to create new scope
var parent = arguments[i].parent;
var active = arguments[i].active;
var childSelect = arguments[i].childSelect;
console.log(active); //logs the correct active
$(parent).children(childSelect)
.not('.'+active).each( function(i, e) {console.log(active);})
//The above console.log logs the correct active
.hover( function() {
console.log(active); //this one always logs menu2_active
$(this).addClass(active);
}, function() {
$(this).removeClass(active);
});
})(); // execute the anonymous function
}
}
Как и раньше, все функции закрывались по одним и тем же ссылкам на переменные и, таким образом, использовали то, что было последним значением, а не значение, когда была создана функция. Используя область действия функции, она будет вести себя так, как вы хотели.