在下面的代码示例中,输出将为3 2 1
。为什么不1 2 3
呢? (
调用中的圆括号符号a1(
是否表示必须首先调用此函数?括号内的所有内容,即a2(a3(50))
必须作为number
的{{1}}参数去使用?
function a1
答案 0 :(得分:5)
JS引擎必须运行该函数,这样它才能获取其返回值,以便将其传递给下一个函数。
答案 1 :(得分:3)
是的,(
中的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所寻找的答案。
第一个函数调用实际上开始一个新的执行上下文,并且该函数跳到“调用栈”的顶部,但是该函数执行的第一件事是对参数进行求值。如果该参数是一个函数,则它将启动其自己的执行上下文,并移至“调用堆栈”的顶部,依此类推。而且,由于堆栈以“后进先出”的方式工作,因此必须首先评估最新堆栈。
答案 2 :(得分:0)
因此,基本上,您要做的就是将一个函数的输出作为参数传递给另一个函数。
为了传递a3返回的值,必须先执行它。因此,您得到3 2 1作为输出。