我运行此脚本时NaN

时间:2014-11-11 23:39:59

标签: javascript html

单击“enregistrer resultat”按钮时,为什么我会为MOYENNE获取NaN。其他一切都没问题,但我得到NaN为MOYENNE。

很抱歉这是法语,但我的学校是法语,所以我使用了法语变量名,功能和对象名。这个程序是一个简单的HTML显示,有一些非常基本的JavaScript。

函数Etudiant是一个对象fyi。不要注意除函数Etudiant,函数enregistrer(),函数afficherMembre()之外的任何函数。这是获取信息并将它们组合成想要的结果并存储的函数它们进入lesInfos变量。函数afficherMoyenne()是我计算5个等级的平均值的地方。

以下是代码:

var nbEtudiants = 0;        // nombre d'étudiants
var MAX_ETUDIANTS = 5;  // nombre maximum d'étudiants
var NOTE_MIN = 0, NOTE_MAX = 100;
var etudiant1, etudiant2, etudiant3, etudiant4, etudiant5;

function Etudiant (nomFourni, prenomFourni, note1, note2, note3, note4, note5){
    this.noEtudiant = 2014000 + nbEtudiants;
        this.nom = nomFourni.toUpperCase();
        this.prenom = prenomFourni.charAt(0).toUpperCase() +
                    prenomFourni.substring(1).toLowerCase();
        this.note1 = document.monFormulaire.txtNote1.value;
        this.note2 = document.monFormulaire.txtNote2.value;
        this.note3 = document.monFormulaire.txtNote3.value;
        this.note4 = document.monFormulaire.txtNote4.value;
        this.note5 = document.monFormulaire.txtNote5.value;
        this.listerInfos = afficherMembre;
        this.moyenne = afficherMoyenne();
    }
}

function enregistrer (){
    if (nbEtudiants == MAX_ETUDIANTS){
        window.alert("DÉSOLÉ... le club n'accepte plus de nouveaux membres...");
        return;
    }
    nbEtudiants ++;
    switch(nbEtudiants){
        case  1 : etudiant1 = new Etudiant(document.monFormulaire.txtNom.value,
                      document.monFormulaire.txtPrenom.value,
                      document.monFormulaire.txtNote1.value,
                      document.monFormulaire.txtNote2.value,
                      document.monFormulaire.txtNote3.value,
                      document.monFormulaire.txtNote4.value,
                      document.monFormulaire.txtNote5.value);
                  window.alert(etudiant1.listerInfos());
                  break;
        case  2 : etudiant2 = new Etudiant(document.monFormulaire.txtNom.value,
                      document.monFormulaire.txtPrenom.value,
                      document.monFormulaire.txtNote1.value,
                      document.monFormulaire.txtNote2.value,
                      document.monFormulaire.txtNote3.value,
                      document.monFormulaire.txtNote4.value,
                      document.monFormulaire.txtNote5.value);                                   
                  window.alert(etudiant2.listerInfos());
                  break;
    }

    function afficherMembre () {
        var lesInfos = this.noEtudiant + " " + this.prenom + " " +  this.nom + " " +" MOYENNE: "   + " " + this.moyenne;
        return lesInfos;
    }

    function afficherMoyenne () {
        var moyenne;
        moyenne = parseInt(((parseInt(this.note1) + (parseInt(this.note2)) + (parseInt(this.note3)) + (parseInt(this.note4)) + (parseInt(this.note5))) / 5))
        return moyenne;
    }

2 个答案:

答案 0 :(得分:0)

问题在于您如何分配this.moyenne

在您的课程Etudiant中,您有以下这一行:

this.moyenne = afficherMoyenne();

当您致电afficherMoyenne()时,context中的this afficherMoyenne不是Etudian的实例 - 而是window var moyenne; moyenne = parseInt(((parseInt(this.note1) + (parseInt(this.note2)) + (parseInt(this.note3)) + (parseInt(this.note4)) + (parseInt(this.note5))) / 5)) return moyenne; 1}}。

所以这个逻辑:

this.note1

具体而言document.monFormulaire.txtNote1.value;之类的内容并未引用实例属性(window.note1),而是寻找this等等。

要解决此问题,您可以使用.bind绑定call,或使用applythis.moyenne = afficherMoyenne.call(this); 调用该函数并传入正确的上下文。像这样:

this

以下是三个JS小提琴:

以下是通过MDN提供有关context和{{1}}的更多信息:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

答案 1 :(得分:0)

问题在于,当您致电afficherMoyenne时,您未绑定到您的对象Etudiant。这成为window类的引用。

您可以将该方法设为您班级的成员

Etudiant.prototype.afficherMoyenne = function () {... the code for your moyenne }

调用绑定到您班级的方法

afficherMoyenne.call(this);

将值传递给方法

function Etudiant (nomFourni, prenomFourni, note1, note2, note3, note4, note5) {
    ...
    this.note1 = document.monFormulaire.txtNote1.value;
    this.note2 = document.monFormulaire.txtNote2.value;
    this.note3 = document.monFormulaire.txtNote3.value;
    this.note4 = document.monFormulaire.txtNote4.value;
    this.note5 = document.monFormulaire.txtNote5.value;
    afficherMoyenne(this.note1, ...)

专业提示

您还可以尝试查看document.monFormulaire.txtNote1.value的值并查看控制台。

console.log(document.monFormulaire.txtNote1.value)

它可以帮助您找出值为NaN的原因