1

我很困惑为什么会这样。基本上,我正在尝试制作一个单词/短语猜谜游戏,如果正确的按钮字母与短语中的字母匹配,它就会发现该字母。我需要将匹配(正确)的字母存储在变量中并返回该字母。如果猜到的字母不正确,我需要该函数返回 null。

function checkLetter(clickedLetter) {
let letterFound = ""
if (clickedLetter.tagName == "BUTTON"){
    clickedLetter.className = "chosen";
    clickedLetter.setAttribute("disabled", "true");
    const li = document.querySelectorAll("li.letter")
    for (let i = 0 ; i < li.length ; i++){
        if (clickedLetter.textContent.toLowerCase() == li[i].textContent.toLowerCase()){
            li[i].classList = "show";
            letterFound = li[i]
           //without this return statement, it runs fine
            return letterFound
        } else {
        //without this return statement, it runs fine
        return null
        }
    }
}
}

qwerty.addEventListener("click", (e) => {
    const clickedLetter = e.target;
    checkLetter(clickedLetter);
});

https://jsfiddle.net/y4q7ot68/1/ 这是一个 jfiddle 演示,其中返回语句被注释掉,工作正常。如果您取消注释 return 语句,它会变得很古怪,并且不会发现任何字母和/或所有字母。我究竟做错了什么?

4

1 回答 1

0

它行为古怪的原因是它在一个 for 循环中并且它多次返回,在第一次返回之后它结束了函数。要保留返回功能,请删除 for 循环中的返回并创建一个 var 并将其设置为 true(如果找到),并从一开始就设置为 false,并在 for 循环之外的 if 语句中进行比较,然后您可以在其中使用 return 语句。

function checkLetter(clickedLetter) {
  let letterFound = ""
  if (clickedLetter.tagName == "BUTTON") {
    clickedLetter.className = "chosen";
    clickedLetter.setAttribute("disabled", "true");
    const li = document.querySelectorAll("li.letter")
    var boolFound = false;
    for (let i = 0; i < li.length; i++) {
      if (clickedLetter.textContent.toLowerCase() == li[i].textContent.toLowerCase()) {
        li[i].classList = "show";
        letterFound = li[i];
        boolFound = true;
      } else {
        /* No return */
      }
    }
    if (boolFound == true) {
      return letterFound;
    } else {
      return null;
    }

  }
}

同样在你调用这个函数的地方不要忘记:

randomvar=checkLetter(clickedLetter);
于 2019-02-21T03:37:40.467 回答