简体   繁体   English

function 返回未定义 javascript

[英]function return undefined javascript

I am new to javascript and I try to make a simple game with level.我是 javascript 的新手,我尝试制作一个简单的关卡游戏。 But my code doesn't running like I want.但是我的代码并没有像我想要的那样运行。 I see many questions on the forum like my problem but I don't understand thanks to them why my function doesn't return anyhting.我在论坛上看到很多问题,比如我的问题,但感谢他们,我不明白为什么我的 function 没有返回任何问题。 Can you explain me why, and not only give me the solution.你能解释我为什么,而不仅仅是给我解决方案。 Thanks !谢谢 !

function level()
{
    var SquareNbrLevel;
    var levelBtn = document.querySelectorAll(".level-btn"); //Select all levels button

    for(var i = 0; i < levelBtn.length; i++)
    {
        levelBtn[i].addEventListener("click", function()
        {
            if(this.textContent === "Easy")
            {

                SquareNbrLevel = 3;
                console.log("easy " + SquareNbrLevel);
                return SquareNbrLevel;

            }
            else
            {
                SquareNbrLevel = 6;
                console.log("hard " + SquareNbrLevel);
                return SquareNbrLevel;
            }

        });
    }

}


var nbr  = level();
console.log("Level" + nbr);

You function attaches click listeners to HTML elements and returns nothing.您 function 将点击侦听器附加到 HTML 元素并且不返回任何内容。

Here's a simplified version and you probably see it:这是一个简化版本,您可能会看到它:

function level()
{
    var SquareNbrLevel;
    var levelBtn = document.querySelectorAll(".level-btn"); //Select all levels button

    for(var i = 0; i < levelBtn.length; i++)
    {
        levelBtn[i].addEventListener("click", clickListenerFunction);
    }

}

I've replaced the listener (callback) with a name and now we see that the level function itself does not return anything.我已经用名称替换了监听器(回调),现在我们看到level function 本身没有返回任何内容。

Event handlers should run after the DOM elements are ready.事件处理程序应该在 DOM 元素准备好之后运行。 It doesn't make sense to have them process when level() is called to get the level.当调用 level() 来获取关卡时让它们处理是没有意义的。

Your level function wasn't returning anything.您的级别 function 没有返回任何内容。 Hence undefined.因此未定义。 And you were calling the level function before a level was set, which also doesn't make sense.而且您在设置级别之前调用了级别 function,这也没有任何意义。

Your attempts to return a value were returning inside the click handler function, which does not affect the level() function itself.您返回值的尝试正在单击处理程序 function 内部返回,这不会影响 level() function 本身。

Simple example that uses a global variable to store the level.使用全局变量存储级别的简单示例。

 var SquareNbrLevel; function level() { return SquareNbrLevel; } var levelBtn = document.querySelectorAll(".level-btn"); //Select all levels button for (var i = 0; i < levelBtn.length; i++) { levelBtn[i].addEventListener("click", function() { if (this.textContent === "Easy") { SquareNbrLevel = 3; console.log("easy " + SquareNbrLevel); } else { SquareNbrLevel = 6; console.log("hard " + SquareNbrLevel); } }); } document.getElementById('level').addEventListener("click", () => { var nbr = level(); console.log("Level" + nbr); });
 <button class="level-btn">Easy</button> <button class="level-btn">hard</button> <button id="level">level</button>

The thing is you're not returning anything from level function.问题是你没有从 function level返回任何东西。 If you return something like this, you'll see the value.如果你返回这样的东西,你会看到这个值。 By default, a function returns undefined in Javascript.默认情况下,function 在 Javascript 中返回undefined

What you perceive as being returned in if..else block is happening in method that handles click event for these levelButtons .认为if..else块中返回的内容发生在处理这些levelButtons的单击事件的方法中。 They occur only when any of these is clicked plus the returned values from this function is not utilised anywhere to see.它们仅在单击其中任何一个时才会出现,并且此 function 的返回值未在任何地方使用以查看。

 function level() { var SquareNbrLevel; var levelBtn = document.querySelectorAll(".level-btn"); //Select all levels button for(var i = 0; i < levelBtn.length; i++) { levelBtn[i].addEventListener("click", function() { if(this.textContent === "Easy") { SquareNbrLevel = 3; console.log("easy " + SquareNbrLevel); handleClick(SquareNbrLevel); } else { SquareNbrLevel = 6; console.log("hard " + SquareNbrLevel); handleClick(SquareNbrLevel); } }); } return " something cool" } var currentSquareNbrLevel = "" function handleClick(SquareNbrLevel){ currentSquareNbrLevel = SquareNbrLevel; alert(SquareNbrLevel) } var nbr = level(); console.log("Level" + nbr);

You can use promises.你可以使用承诺。

 function level() { promise = new Promise((resolve, reject) => { var SquareNbrLevel; var levelBtn = document.querySelectorAll(".level-btn"); //Select all levels button for(var i = 0; i < levelBtn.length; i++) { levelBtn[i].addEventListener("click", function() { if(this.textContent === "Easy") { SquareNbrLevel = 3; console.log("easy " + SquareNbrLevel); resolve( SquareNbrLevel); } else { SquareNbrLevel = 6; console.log("hard " + SquareNbrLevel); resolve( SquareNbrLevel); } }); } }); return promise } level().then(nbr=>{ console.log("Level" + nbr); });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM