先追這段程式
兩個函式都把 4 乘二:一個把 8 放入記錄,另一個傳回 8。例子用陣列模擬顯示記錄,方便一次過比較。
const transcript=[];
function loggedDouble(n){transcript.push(n*2);}
function returnedDouble(n){return n*2;}
const result={logged:typeof loggedDouble(4),returned:returnedDouble(4),transcript};
console.log(JSON.stringify(result));
{"logged":"undefined","returned":8,"transcript":[8]}| 函式 | 記錄 | 呼叫者收到 |
|---|---|---|
| loggedDouble(4) | transcript: [8] | undefined |
| returnedDouble(4) | 沒有寫入記錄 | 8 |
結果為何如此
函式跑到結尾而沒有 return,呼叫者收到 undefined。記下數字是另一件事。這裡用 typeof 顯示 undefined;直接放入 JSON 物件,該欄反而會被省略。
比較另一種寫法
呼叫結果再加一會得 NaN,即使記錄內有 8。用 String() 寫清楚 NaN,避免 JSON 把它變成 null。
const transcript=[];function loggedDouble(n){transcript.push(n*2);}
console.log(JSON.stringify({next:String(loggedDouble(4)+1),transcript}));
{"next":"NaN","transcript":[8]}試清邊界
loggedDouble 怎樣保留記錄,同時讓呼叫者算出 9?
查看參考答案
先存 n*2,寫入記錄後 return 同一值。呼叫者收到 8,便可再加一。
const transcript=[];function doubled(n){const value=n*2;transcript.push(value);return value;}
console.log(JSON.stringify({zero:doubled(0),next:doubled(4)+1,transcript}));
{"zero":0,"next":9,"transcript":[0,8]}