Javascript 什么';是用这个代码计算的吗?

Javascript 什么';是用这个代码计算的吗?,javascript,Javascript,采访问题, 这个代码计算了什么 (function(n){return (n && n*arguments.callee(n-1)) || 1;})(10); a) 10! b) Nothing, it's an infinite loop. c) 10 to the power of 10 d) 10!/10 e) The 10th Fibonacci number. a)10表示10的阶乘(10 x 9 x 8 x…x 1的

采访问题,

这个代码计算了什么

    (function(n){return (n && n*arguments.callee(n-1)) || 1;})(10);

    a) 10!
    b) Nothing, it's an infinite loop.
    c) 10 to the power of 10
    d) 10!/10
    e) The 10th Fibonacci number.
a)10表示10的阶乘(10 x 9 x 8 x…x 1的数学表达式)

您可以猜测连续调用的结果:

(function(n){return (n && n*arguments.callee(n-1)) || 1;})(1);
1
(function(n){return (n && n*arguments.callee(n-1)) || 1;})(2);
2
(function(n){return (n && n*arguments.callee(n-1)) || 1;})(3);
6
(function(n){return (n && n*arguments.callee(n-1)) || 1;})(4);
24
(function(n){return (n && n*arguments.callee(n-1)) || 1;})(5);
120
(function(n){return (n && n*arguments.callee(n-1)) || 1;})(10);
3628800
然后,如果您分析代码:

  • 如果输入为0,则函数返回1
  • 如果输入大于0,则返回与调用的函数乘以
    n-1
    的输入
更准确地说,
(n&&n*参数。被调用方(n-1))
是一种布尔运算,它的返回值是最后一个计算为true的操作数,这是
n*参数的值。被调用方(n-1)
每次
n>0
,而不是1(由于
|1


参数。被调用方
是javascript中的递归调用。

分析递归调用的一种简单方法是写下所有调用的堆栈,然后按弹出顺序求值

[
    10 * (recurse with 10 - 1),
    9 * (recurse with 9 - 1),
    8 * (recurse with 8 - 1),
    7 * (recurse with 7 - 1),
    6 * (recurse with 6 - 1),
    5 * (recurse with 5 - 1),
    4 * (recurse with 4 - 1),
    3 * (recurse with 3 - 1),
    2 * (recurse with 2 - 1),
    1 * (recurse with 1 - 1),
    1 (recursion stops because 0 is falsey, therefore 1 will be returned)
]
然后,我们使用堆栈并评估向上的路径:

[
    10 * 362880 = 3628800,
    ...,
    6 * 120 = 720,
    5 * 24 = 120,
    4 * 6 = 24,
    3 * 2 = 6,
    2 * 1 = 2,
    1 * 1 = 1
    1 = 1 <-- start here then work up
]
[
10 * 362880 = 3628800,
...,
6 * 120 = 720,
5 * 24 = 120,
4 * 6 = 24,
3 * 2 = 6,
2 * 1 = 2,
1 * 1 = 1

1=1@SpencerWieczorek输出为
3628800
。但是这里哪一个是正确的选择?没有,这是语法错误(在严格模式下)。或者给出一些错误的答案,以确保你不会在这样一个会提出面试问题的地方得到这份工作。我真的希望你现在不要坐在面试中,把他们的问题发布到;)@torazaburo没有严格模式,输出是
3628800
@Larabone我不知道你说的“没有严格模式”是什么意思可能该程序是由“node--use_strict”命令运行的。可能它是在ES6环境中运行的,在该环境中,严格模式是默认模式。如果您确实想要该作业,请向面试官指出这一点,或者至少提及
参数。被调用方被弃用,被认为是不好的做法,并且没有必要。