单击“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;
}
答案 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
,或使用apply
或this.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的原因