在下面的代码示例中,输出将为3 2 1。为什么不1 2 3(调用中的圆括号符号a1(是否表示必须首先调用此函数?括号内的所有内容,即a2(a3(50))必须作为number参数作为function a1

function a1(number) {
  console.log("1");
  return number;
}

function a2(number) {
  console.log("2");
  return number;
}

function a3(number) {
  console.log("3");
  return number;
}

a1(a2(a3(50)));

最佳答案

是的,在(中的a1()表示要调用它。而且,它要做的第一件事就是评估传入的参数。在这种情况下,传入的是函数调用,即具有自己的()集的函数。

这意味着a1需要等待a2求值,以便它可以将调用a2的返回值作为参数传递给a1。接受a2作为参数的a3也是如此。

在以下伪代码中,您可以看到:

function a1(number) {
  return number;
}


如果这样称呼:

a1(2+3) // you can't just run a1(2)


您必须首先评估2+3,并评估带有括号的函数,您必须运行整个函数。在您的情况下,该功能会将某些内容记录到控制台。

编辑:在下面添加它,因为它在注释中,并且它是OP寻找的答案。

实际上,第一个函数调用会启动一个新的执行上下文,并且该函数会跳到“调用堆栈”的顶部,但是该函数执行的第一件事是对参数进行求值。如果该参数是一个函数,则它将启动其自己的执行上下文,并移至“调用堆栈”的顶部,依此类推。随着堆栈以“后进先出”的方式工作,必须首先评估最新堆栈。

10-06 05:04
查看更多