You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何排序函数返回undefined?控制台输出正确但函数返回值异常

递归函数返回undefined但控制台打印正确?问题出在这儿!

先看看你的代码:

let sorted = [];
function reset(){ sorted = []; }
function sort(list) {
  let least = list[0];
  for (let i = 0; i < list.length; i++){
    if (list[i] < least ){
      least = list[i];
    }
  }
  sorted.push(least);
  list.splice(list.indexOf(least),1);
  if (list[0] !== undefined){
    sort(list)
  } else {
    let answer = sorted;
    reset();
    console.log(answer);
    return answer;
  }
}
let s...

这个问题其实很典型——你在递归调用的时候没有把返回值传递回上层函数。

咱们拆解一下执行流程:

  • 每次调用sort(list),当数组还没处理完时(list[0] !== undefined),你会再次调用sort(list),但这次调用的结果没有被return出去。
  • 只有最后一次递归(数组处理完进入else分支)会返回正确的answer,但这个返回值只回到了它的上一层调用,而上一层调用并没有把这个值继续返回,就这样一层层“断了”,导致最开始的函数调用拿不到任何返回值,结果就是undefined。
  • 至于控制台能打印正确结果,是因为最后那层递归确实生成了正确的answer并执行了console.log(answer)。

解决办法超简单,只需要在递归调用时加上return:

if (list[0] !== undefined){
  // 把递归调用的结果返回给上层
  return sort(list)
} else {
  let answer = sorted;
  reset();
  console.log(answer);
  return answer;
}

这样每一层递归都会把最终的排序结果传递回上一层,直到最外层的调用,就能拿到正确的返回值了。

另外提个小建议:你的代码里用splice修改了原数组,这会给调用者带来意料之外的副作用。如果不想修改原数组,可以在函数开头先复制一份:

function sort(list) {
  // 复制原数组,避免修改原数据
  let newList = [...list];
  let least = newList[0];
  for (let i = 0; i < newList.length; i++){
    if (newList[i] < least ){
      least = newList[i];
    }
  }
  sorted.push(least);
  newList.splice(newList.indexOf(least),1);
  if (newList[0] !== undefined){
    return sort(newList)
  } else {
    let answer = sorted;
    reset();
    console.log(answer);
    return answer;
  }
}

内容的提问来源于stack exchange,提问作者Austin Ballard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:22:09