3 回答

TA貢獻1831條經驗 獲得超9個贊
return終止當前函數,并將控制流返回給調用者。
當foo(3);被調用時,函數用i參數 3初始化。它使if語句失敗,打印begin: 3,然后調用foo(3 - 1);。此時,當前函數(i參數為 3的函數)將暫停,直到foo(3 - 1);調用完成。
foo(2);打印begin: 2,然后在調用時暫停foo(1)。
foo(1)打印begin: 1,然后在調用時暫停foo(0)。
foo(0)打印begin: 0,并返回:它終止,并將控制流返回給它的調用者,即 的函數調用foo(1)。
foo(1)恢復,并繼續執行,打印end: 1。這是函數塊的結尾,因此foo(1)函數調用結束,將控制流返回到foo(2)函數調用。
foo(2)恢復,打印end: 2,然后終止,產生控制流回到foo(3)。然后foo(3)打印end: 3,并終止。
return僅終止當前功能。終止所有調用函數(直到catch遇到 a)的唯一方法是拋出錯誤:
function foo(i) {
if (i < 0)
throw new Error();
console.log('begin: ' + i);
foo(i - 1);
console.log('end: ' + i);
}
foo(3);

TA貢獻1869條經驗 獲得超4個贊
這應該可以幫助您跟蹤代碼:
foo(3)
|-- "begin 3"
|-- foo(2)
| |-- "begin 2"
| |-- foo(1)
| | |-- "begin 1"
| | |-- foo(0)
| | | |-- "begin 0"
| | | |-- foo(-1) // returns nothing
| | | |-- "end 0"
| | |-- "end 1"
| |-- "end 2"
|-- "end 3"
添加回答
舉報