怎么理解这个返回值?

var time = 0; var res = "";
var a = function () {
    time++;
    if (time < 5) {
        res = a();
    }else{
        return 1;
    }
    console.log(res);
    return "end"+time
};
a();
// 下面是执行结果
1
end5
end5
end5
"end5"

为什么先打印1呢

阅读 2.6k
5 个回答

你这是个递归函数,在time<5之前要递归调用4次a(),当time===5时,递归结束return 1;递归结束是从里往外进行返回,所以第一个打印出来的是1。而time是个全局变量,所以最后都是5。
你可以这样改一下看的更清楚:

var time = 0; var res = "";
var a = function () {
    time++;
    let current = time;
    if (time < 5) {
        res = a();
    }else{
        return 1;
    }
    console.log(res,current);
    return "end"+current;
};
a();

因为你将变量a赋值给res,当执行函数a,进入条件表达式time < 100;虽然会再次调用自身,但是此时函数并没有返回值,所以最后的resundefined

var sum = time = 0;
var a = function () {
  sum += time + 1;
  time++;
  if (time < 100) {
    return a();
  } else {
    return 1;
  }
}

var res = a();

自己打个debugger(断点),然后一步步调式啊...

var time = 0; var res = "";
var a = function () {
    time++;
    debugger
    if (time < 5) {
        res = a();
        debugger
    }else{
        debugger
        return 1;
    }
    debugger
    console.log(res);
    return "end"+time
};
a();

打上四个debugger,然后在游览器里一步步按F9查看变量的值。其实这个返回值就很好理解了。
因为time一直小于5,因此这段代码不断调用a(),当time大于5,就进入else条件状态分支了,然后retrun 1;
这时候res等于1了,所以console.log(res)打印出来的是1,但此时time已经是5了,所以return "end"+time返回的就是end5,但是我不知道为啥这里调用了三次...

time<5的时候,a一直递归调用自身,无法执行下一步,当time===5时,进入else,此时res被赋值为最内层a()的返回值1,然后,外层的a继续执行,此时time为5,输出end5, 再外层依次类推

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题