JavaScript - 循环的一部分中的“变量未定义”,在不同的部分工作

时间:2012-02-28 15:48:07

标签: javascript jquery

使用以下代码,我收到此错误RewardPurchases.PurchasesArray[i].Student_Name is undefined

$('button#random').click( function() {
    var Num = Math.floor(Math.random() * Total+1);
    Num--;

    for (var i in RewardPurchases.PurchasesArray) {
/* --------> */     
        $('#display').text("Ticker number " + Num + " in the LEAP database belongs to...\n\n\n" + RewardPurchases.PurchasesArray[i].Student_Name.toUpperCase() + " (" + TutorGroup + ")").show().delay(300);

        if (i == Num) {
            var TutorGroup = '';

            Frog.API.get('timetable.getClasses',
            {
                'params': {'student': RewardPurchases.PurchasesArray[i].Student_ID },
                'onSuccess': function(data) {
                    for (var i = 0; i < data.length; i++) {
                        if (data[i].subject.name == "Tut Period") {
                            TutorGroup = data[i].name.replace("/Tp", "");
                        }
                    }
                }
            });

            $('#display').animate({'font-size': 36}, 1500, function() {
                $(this).prepend('<p>!!! WINNER !!!</p>');
            });

            alert("Ticker number " + Num + " in the LEAP database belongs to...\n\n\n" + RewardPurchases.PurchasesArray[i].Student_Name.toUpperCase() + " (" + TutorGroup + ")");
        }
    }
} );

但是,如果我按如下方式移动此行$('#display').text(...,则错误消失:

$('button#random').click( function() {
    var Num = Math.floor(Math.random() * Total+1);
    Num--;

    for (var i in RewardPurchases.PurchasesArray) {

        if (i == Num) {
            var TutorGroup = '';
/* --------> */         
            $('#display').text("Ticker number " + Num + " in the LEAP database belongs to...\n\n\n" + RewardPurchases.PurchasesArray[i].Student_Name.toUpperCase() + " (" + TutorGroup + ")").show().delay(300);

            Frog.API.get('timetable.getClasses',
            {
                'params': {'student': RewardPurchases.PurchasesArray[i].Student_ID },
                'onSuccess': function(data) {
                    for (var i = 0; i < data.length; i++) {
                        if (data[i].subject.name == "Tut Period") {
                            TutorGroup = data[i].name.replace("/Tp", "");
                        }
                    }
                }
            });

            $('#display').animate({'font-size': 36}, 1500, function() {
                $(this).prepend('<p>!!! WINNER !!!</p>');
            });

            alert("Ticker number " + Num + " in the LEAP database belongs to...\n\n\n" + RewardPurchases.PurchasesArray[i].Student_Name.toUpperCase() + " (" + TutorGroup + ")");
        }
    }
} );

我不明白为什么会这样? i声明没有定义if

我正在尝试在数组中显示每个名称,然后选择一个随机名称并用“WINNER!”以大字体显示它。在它之上。

提前致谢,

2 个答案:

答案 0 :(得分:2)

在这种情况下,使用for .. in并不是最好的做法。它对 ALL 对象属性进行深度挖掘,包括属于原型的函数。

只有$('#display').text(...导致问题的原因是您尝试使用属性RewardPurchases.PurchasesArray [i]的属性。在其他地方,你自己使用它,它不会失败,它会在这些情况下默默地返回undefined。 (a.k.a.,'params': {'student': RewardPurchases.PurchasesArray[i].Student_ID }。)

使用包含for ... in循环中所有代码的测试,typeof RewardPurchases.PurchasesArray[i] === 'object' && typeof RewardPurchases.PurchasesArray[i] !== null应该可以做到这一点,确保在迭代中使用的每个属性只是一个对象,而不是函数或一些“标量”值。

注意:你也可以使用RewardPurchases.PurchasesArray[i].hasOwnProperty('propertyName'),但并不是所有浏览器都普遍支持,所以我给出的上述示例更安全,适用于您的目的。

答案 1 :(得分:1)

你的阵列的完整性如何?

//RewardPurchases.PurchasesArray
[0] undefined
[1] { Student_Name: undefined }
[2] { Student_Name: 'Bob' }

以上都在数组中有效。 [0][1]都会向您提供您收到的错误。

如果PurchasesArray不是数组而是对象 - 那么你需要在循环中进行检查。

for (var i in RewardPurchases.PurchasesArray) {
   if(!RewardPurchases.PurchasesArray.hasOwnProperty(i)) {
     continue;
   }

   //rest of code...
}