J'ai le code suivant avec lequel j'ai besoin de précisions. Je veux le comprendre parfaitement avant de passer à autre chose. Je sais que l'exemple peut être idiot et je suis sûr qu'il y a beaucoup de meilleures façons de résoudre le problème, mais pour les besoins de cette leçon, la personne a utilisé cet exemple.
Tout ce dont j'ai besoin est de clarifier comment exactement le flux de la fonction de partition fonctionne et en avant. D'où viennent les valeurs? Comment ça s'additionne chaque fois que la personne donne la bonne réponse?
Je veux essentiellement comprendre comment ce code génère le numéro à afficher sur la console chaque fois que l'utilisateur entre une valeur vraie dans l'alerte. Je suis désolé si je ne viens pas clairement, j'ai juste besoin de comprendre comment le code fonctionne à partir de function score () et au-delà. Je ne pourrais pas pour la vie de moi le comprendre. D'où sc tire-t-il ses valeurs et où les transmet-il aussi et; et; et.
Y a-t-il quelqu'un qui est prêt à me donner une présentation de la façon dont ce code s'articule. Je serais éternellement reconnaissant.
(function() {
function Question(question, answers, correct) {
this.question = question;
this.answers = answers;
this.correct = correct;
}
Question.prototype.displayQuestion = function() {
console.log(this.question);
for (var i = 0; i < this.answers.length; i++) {
console.log(i + ': ' + this.answers[i]);
}
}
Question.prototype.checkAnswer = function(ans, callback) {
var sc;
if (ans === this.correct) {
console.log('Correct answer!');
sc = callback(true);
} else {
console.log('Wrong answer. Try again :)');
sc = callback(false);
}
this.displayScore(sc);
}
Question.prototype.displayScore = function(score) {
console.log('Your current score is: ' + score);
console.log('------------------------------');
}
var q1 = new Question('Is JavaScript the coolest programming language in the world?',
['Yes', 'No'],
0);
var q2 = new Question('What is the name of this course\'s teacher?',
['John', 'Micheal', 'Jonas'],
2);
var q3 = new Question('What does best describe coding?',
['Boring', 'Hard', 'Fun', 'Tediuos'],
2);
var questions = [q1, q2, q3];
function score() {
var sc = 0;
return function(correct) {
if (correct) {
sc++;
}
return sc;
}
}
var keepScore = score();
function nextQuestion() {
var n = Math.floor(Math.random() * questions.length);
questions[n].displayQuestion();
var answer = prompt('Please select the correct answer.');
if(answer !== 'exit') {
questions[n].checkAnswer(parseInt(answer), keepScore);
nextQuestion();
}
}
nextQuestion();
})();
4 Réponses :
nextQuestion () pour lancer le processus var n = Math.floor (Math.random () * questions.length); sélectionne une question aléatoire dans votre liste de questions displayQuestion () affiche les informations du deuxième paramètre new Question () comme réponses possibles. Le troisième paramètre est la bonne réponse. ("Veuillez sélectionner la bonne réponse."); et si ce n'est pas exit , puis comparez la réponse avec la valeur correcte. li >
keepScore (correct) pour ajouter le score au résultat final. nextQuestion(); Merci pour votre réponse rapide. Pouvez-vous clarifier comment 1 est additionné chaque fois que la réponse est correcte si sc = 0; D'où viennent les valeurs? le sc = callback () a quelque chose à voir avec ça?
sc obtient sa valeur en raison de la fermeture. Chaque fois que la fonction imbriquée qui est retournée par score () et l'instruction if if (correct) est vraie, le score est incrémenté. Considérez un extrait général ci-dessous.
function score(){
var sc = 0;
return function(){
sc++;
console.log(`I am sc of score: ${sc}`);
return sc;
}
}
let temp = score();
function wrapper(callback){
var sc = 0;
console.log(`I am sc of wrapper: ${sc}`);
callback();
}
wrapper(temp)
wrapper(temp)
wrapper(temp)
wrapper(temp)
Donc, dans l'extrait ci-dessus, la fonction externe score n'est appelée qu'une seule fois et fait deux choses:
sc qui est 0 sc fera référence à la variable sc créée dans la portée supérieure. Cette utilisation est juste pour empêcher la création d'une variable globale
Considérez un autre simple extrait de code.
Question.prototype.checkAnswer = function(ans, callback) {
if (ans === this.correct) {
console.log('Correct answer!');
this.displayScore(callback(true));
} else {
console.log('Wrong answer. Try again :)');
this.displayScore(callback(false));
}
}
Dans l'extrait de code ci-dessus, la portée parent est la portée globale et la portée enfant est la portée de la fonction. Maintenant, la variable count est présente dans le counter () (même si elle n'est pas déclarée dans counter () ) en raison de la fermeture.
score () est comme la portée globale (dans le deuxième extrait), return function (correct) {...} est exactement comme la fonction counter () imbriquée dans le deuxième extrait. >
sc est exactement comme la variable count . Pourriez-vous peut-être expliquer un peu plus le
prototype.checkAnswer
Cette méthode prend deux arguments. ans et callback.
Considérez la ligne dans la fonction nextQuestion()
questions[n].checkAnswer(parseInt(answer), keepScore);
Vous êtes incroyable, merci beaucoup. J'ai posé une question très déroutante mais vous saviez toujours ce que je voulais ... Passez une merveilleuse journée. Maintenant, j'ai juste besoin de bien comprendre les fermetures xD
Pourriez-vous peut-être expliquer un peu plus le prototype.checkAnswer?
Le point un peu délicat pour les non-initiés ici est que la fonction score renvoie une fonction et utilise un fermeture .
// each gets their own instance of // that inner function with its own // independent sc variable. const playerOneScore = score(); const playerTwoScore = score(); playerOneScore(true); // 1 playerOneScore(true); // 2 playerTwoScore(false); // 0 playerTwoScore(true); // 1
Cette ligne:
var keepScore = score();
crée une variable pour contenir le score actuel, puis renvoie une fonction que vous pouvez appeler pour incrémenter cette variable. La variable ne peut pas être déclarée dans la fonction car elle serait recréée à chaque fois que la fonction est appelée:
function score () {
var sc = 0; // unavailable outside this function
// return this function to the caller and voila!
// they now have a self-contained scorekeeper function.
return function(correct) {
if (correct) {
sc++;
}
return sc;
}
}
Mais vous ne voulez pas non plus que la variable soit accessible à tous, donc vous ne voulez pas faire ça non plus:
function score () {
var sc = 0; // unavailable outside this function
// a new function that has access to the outer function's sc variable.
function(correct) {
if (correct) {
sc++;
}
return sc;
}
}
Alors que pouvons-nous faire? Nous pouvons:
Premièrement: Créer la variable dans une portée de fonction, où elle est protégée des manigances extérieures:
function score () {
var sc = 0; // unavailable outside this function
}
Deuxièmement: Créer une autre fonction à l'intérieur du premier qui peut modifier la variable:
// don't want this either.
// score shouldn't be modifiable outside of our keepScore method.
let sc = 0;
function score (correct) {
if (correct) {
sc++;
}
return sc;
}
// this approach works, but now cheaters can set
// the score outside our scorekeeping function:
sc = 999999; // oh noes! hacks!
Enfin, renvoyer la fonction interne de score () donne aux étrangers un moyen de enregistrez les bonnes réponses sans exposer la variable de score elle-même:
// can't do this. sc gets recreated and reset on every call:
function score (correct) {
var sc = 0;
if (correct) {
sc++
}
return sc;
}
Alors maintenant, quand vous faites cela:
var sc = 0;
keepScore est cette fonction interne avec sa propre variable interne sc .
Si vous aviez une édition multijoueur, vous pourriez en obtenir une pour chaque joueur:
XXX
Je pense qu'une fois que vous aurez compris cela, le reste aura beaucoup plus de sens.
Merci Ray. Je suis entré dans cette pensée en pensant que mon message allait très probablement être supprimé, car c'était mon premier message sur Stack. Mais je suis agréablement surpris par l'incroyable communauté de patients sur Stack. Ce sera définitivement ma place à partir de maintenant. Merci pour votre temps.
Je pense que la plupart des gens ici sont heureux d’aider quiconque fait un effort de bonne foi, essayant vraiment de comprendre.
Je veux juste vous remercier encore! Je passais en revue votre code et quelque chose s'est cassé. Je ne pouvais pas croire que je l'avais manqué. J'ai trop compliqué la chose à tel point que je n'ai pas compris le correct dans la fonction de retour ... Je me sens tellement bête. J'avais deux bons exemples et j'ai encore du mal, mais je comprends vraiment maintenant: D
Ici, la fonction de score est une fermeture
L'état de sc à l'intérieur du score est initialisé lorsque le score est appelé.
var keepScore = score ();
Maintenant, le keepScore contient la fonction qui est retournée par la fermeture c'est-à-dire
function (correct) {
if (correct) {
sc++; // it has a "closure" over it
}
return sc;
}
qui accepte une valeur booléenne. C'est, keepScore (true) ou keepScore (false)
Maintenant, cette fonction keepScore est transmise pour vérifier la réponse
questions [n] .checkAnswer (parseInt (réponse), keepScore);
Dans la réponse de vérification, si la réponse est correcte, elle passera true au keepScore
callback (true) keepScore (true) code>
Si vous voulez avoir plus de clarté sur la fermeture, vous pouvez parcourir cet article
https://github.com/getify/You-Dont-Know-JS/blob/master /up%20%26%20going/ch2.md#closure
J'ai des devoirs à faire. J'ai vraiment besoin d'avoir une bien meilleure compréhension des fermetures. Merci pour la référence.