首页 > 解决方案 > 调用withing本身的函数

问题描述

我正在尝试使用提示创建一个简单的猜谜游戏。我得到了它的工作,但我有一个我无法修复的错误

在游戏中,您应该输入一个最大数字,用于在该最大限制内产生一个随机数,然后在创建随机数后,逻辑会提示您输入数字,直到您猜到它,最后它会告诉您如何你必须做很多尝试。

我创建了一个函数来验证最大数字是否确实是一个数字,如果不是,那么该函数会调用自己再次请求最大数字。如果我输入一个数字,它可以正常工作,但如果你第一次尝试输入一个字符串,然后当它再次询问你输入正确的数字时,一切都会变糟,因为“max”的值变成了 NaN,我不知道为什么!(小心,因为它进入了一个无限循环)

我添加了几个console.log,因此您可以在该场景中的控制台中看到“max”结果的值。(见图)

控制台中最大值的图像

我在下面的链接中查看了这个问题,我认为这可能是因为该函数在该函数中调用了自身,或者它与 let 变量范围有关。我不知道。

循环内的 JavaScript 闭包——简单实用的示例

这是我的代码:

let maximun = required();
const ram = Math.floor(Math.random()*maximun+1);
// console.log(ram);
let timesGuess = 1;
let num = parseInt(prompt('Guess the number'));

while (true) {
    console.log(`i am ram${ram}`);

    if (!isNaN(num)) {
        if (num < ram) {
            num = parseInt(prompt('Too low! Guess Again'));
            timesGuess++;
        } else if (num > ram) {
            num = parseInt(prompt('Too high! Guess Again'));
            timesGuess++;
        }
    } else {
        num = parseInt(prompt('Must be a number'));
    }
    
    if (num === ram) {
        break;
    }
}

alert(`it took you ${timesGuess} guesses`);



function required(){
    let max = parseInt(prompt("Enter your maximum number"));
    if (max === " " || isNaN(max)) {
        alert("Enter a numeric value");
        required();
    } 
    console.log(`i am max${max}`);
    return max;
}

非常感谢您的支持

想想这个问题的答案我相信这是逻辑,请确认我是否温暖哈哈哈

使用原始代码,如果我输入 4 个连续的字符串并在第五次尝试中输入数字 10,因为我没有返回函数,所以第五个值 10 在第五次函数调用中丢失,然后在第一次调用中我只剩下甚至在第二次调用函数之前“max”的原始值。现在,通过您的修复,由于函数总是返回 10 从函数的第五次调用传递,然后到第四次,依此类推,直到它到达第一次调用,现在“max”的值是 10,即返回存储在“maximun”中

标签: javascript

解决方案


发生无限循环是因为您没有返回函数调用的值。您只是在调用该函数。这样做是让您在下一次尝试时收到一个数字,但实际上并没有在第一次调用时将其设置为变量 max。当您的函数返回(内部调用)时,第二个输入(您输入的最大数量)将被丢弃。

简单的修复:在内部函数调用之前放置一个 return 语句。

let maximun = required();
const ram = Math.floor(Math.random()*maximun+1);
// console.log(ram);
let timesGuess = 1;
let num = parseInt(prompt('Guess the number'));

while (true) {
    console.log(`i am ram${ram}`);

    if (!isNaN(num)) {
        if (num < ram) {
            num = parseInt(prompt('Too low! Guess Again'));
            timesGuess++;
        } else if (num > ram) {
            num = parseInt(prompt('Too high! Guess Again'));
            timesGuess++;
        }
    } else {
        num = parseInt(prompt('Must be a number'));
    }
    
    if (num === ram) {
        break;
    }
}

alert(`it took you ${timesGuess} guesses`);



function required(){
    let max = parseInt(prompt("Enter your maximum number"));
    if (max === " " || isNaN(max)) {
        alert("Enter a numeric value");
        return required();
    } 
    console.log(`i am max${max}`);
    return max;
}


推荐阅读