简体   繁体   English

为什么调用我的函数返回未定义?

[英]Why does calling my function return undefined?

I'm trying to understand why when I call maxofThree on any array, undefined is returned? 我试图理解为什么当我在任何数组上调用maxofThree时,返回undefined? I'm fairly new to JS so appreciate your help! 我是JS的新手,非常感谢您的帮助!

function maxofThree (array) {
    for (var i; i < array.length; i++) {
        var largestNumber = 0;

        if (array[i] > largestNumber) {
            largestNumber = array[i];
        }
        return largestNumber;
    }
}

You have to return after the loop, and you have to start i of at zero. 你必须在循环后返回,而你不得不开始i的为零。

function maxofThree(array) {
    var largestNumber = array[0];
    for (var i=0; i < array.length; i++) {
        if (array[i] > largestNumber) {
            largestNumber = array[i];
        }
    }
    return largestNumber;
}

As a sidenote, you could use Math.max to get the largest number as well 附带说明,您也可以使用Math.max来获得最大的数字

function maxofThree(array) {
    return Math.max.apply(null, array);
}
function maxofThree (array) {
    for (var i; i < array.length; i++) { //the variable i is not initialized i==undefined
       //At each loop you increment i==undefined undefined++ equals to NaN
       //So i at first loop is undefined, at second loop is NaN
       //undefined < any number except 0, NaN < any number is always false, so the loop is executed only one time
        var largestNumber = 0; //At each loop you initialize/reset the variable largestNumber  to 0

        if (array[i] > largestNumber) {
            largestNumber = array[i]; //i is NaN, array[NaN]==undefined
            //So largestNumber is always undefined
        }
        return largestNumber; //You return largestNumber before next loop occurs, you return undefined
        //The next loop never occurs, because you have done a return
    }
}

Fixed code: 固定代码:

function maxofThree (array) {
    var largestNumber = 0; //Initialize largestNumber to 0 before loops occurs
    // I suppose all numbers are positive, otherwise you need to rethink the solution
    for (var i=0; i < array.length; i++) { //Initialize i to 0
        //At each loop i is incremented until i < array.length

        if (array[i] > largestNumber) {
            largestNumber = array[i];
        }
         //The next loop will occurs
    }
    return largestNumber; //At the end of loop you return the largestNumber
}

You didn't initialize i , so by default it's undefined . 您没有初始化i ,因此默认情况下它是undefined When you make the comparison i < array.length , undefined is converted to the number NaN (not a number), and so the expression evaluates to false . 当您进行比较i < array.lengthundefined将转换为数字NaN (而不是数字),因此表达式的计算结果为false That means you never enter the loop and you never hit a return statement before completion of the function, so it returns undefined . 这意味着您永远不会进入循环,也不会在函数完成之前命中return语句,因此它返回undefined

You should initialize i to 0 . 您应该将i初始化为0 After that, there are still 2 more problems. 之后,还有2个问题。

Assigning 0 to largestNumber at the start of the loop means that it's going to be reset to 0 on every iteration. 在循环开始时将0分配给largestNumber意味着每次迭代都将其重置为0 You should move that statement to before the loop. 您应该将该语句移动到循环之前。

Also, having the return in the loop would cause the function to return immediately at the end of the first iteration. 同样,在循环中包含return会导致该函数在第一次迭代结束时立即返回。 You should move that statement to execute after the loop. 您应将该语句移至循环后执行。

While we're at it, you should rename the function. 在进行此操作时,您应该重命名该函数。 It's not like you're really limiting yourself to 3 elements (not that you ever should). 并不是说您实际上将自己限制在3个元素内(不是您曾经应该这样做)。 Also, array is too generic. 同样, array也太通用了。 They need to be numbers, right? 他们必须是数字,对不对? So call them numbers . 所以称它们为numbers

Your function should look like this: 您的函数应如下所示:

function maximum(numbers) {
    var largestNumber = 0;
    for (var i = 0; i < numbers.length; i++) {
        if (numbers[i] > largestNumber) {
            largestNumber = numbers[i];
        }
    }
    return largestNumber;
}

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

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