在下面的代码示例中,输出将为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寻找的答案。
实际上,第一个函数调用会启动一个新的执行上下文,并且该函数会跳到“调用堆栈”的顶部,但是该函数执行的第一件事是对参数进行求值。如果该参数是一个函数,则它将启动其自己的执行上下文,并移至“调用堆栈”的顶部,依此类推。随着堆栈以“后进先出”的方式工作,必须首先评估最新堆栈。