5 回答

TA貢獻1963條經驗 獲得超6個贊
肯定不會輸出3個1,首先箭頭函數當參數并沒有執行,其次箭頭函數里執行后的a值也需要返回出來,不然是undefined,可以把這樣來看a是從哪兒來的:
function newFun(a){
console.log(`C: ${a}`);
return function(j){
console.log(`D: ${j}`);
}
}
function fun(a) {
console.log(`A: ${a}`);
newFun(((i)=>{
console.log(`B: ${i}`);
return i;
})(a))(a)
}
fun(1)

TA貢獻1880條經驗 獲得超4個贊
當然不會了,人肉單步一下就知道了,跳過聲明,從fun(1)
進入,請跟著序號走
function newFun(a) { // 2-1: 調用newFun,參數為剛剛的箭頭函數
return function(a) { // 3: 返回一個匿名函數,這個匿名函數接受并打印參數a
console.log(a);
}
// 4-0: 函數newFun結束
}
function fun(a) { // 0-1: 調用fun,參數1
console.log(a); // 1: 打印a,即參數1
newFun(a => { // 2-0: 調用newFun,參數為一個箭頭函數(注意這個函數是作為參數被聲明的,此時這個函數還沒有被調用)
console.log(a);
});
// 4-1: 函數newFun的調用已經結束,并且它返回了一個匿名函數,但這個匿名函數沒有被一個變量接收
// 5-0: 函數fun的調用已經結束,該函數沒有返回任何值
}
fun(1); // 0-0: 調用fun,參數1
// 5-1: 函數fun的調用已經結束,腳本結束
可以看出從頭到尾只打印了一次1
,只有函數fun
中的第一個console.log(a)
會被執行,作為迷惑你的另外兩個console.log(a)
分別在兩個作為參數和返回值的函數中,但沒有被調用。要使得這兩個console.log(a)
被執行,只要調用其所屬的函數即可
function newFun(a) { // 3-1: 調用newFun,參數為剛剛的箭頭函數
return function(a) { // 4: 返回一個匿名函數,這個匿名函數接受并打印參數a
console.log(a);
}
// 5-0: 函數newFun結束
}
function fun(a) { // 0-1: 調用fun,參數1
console.log(a); // 1: 打印a,即參數1
let brandNewFun = a => console.log(a);
brandNewFun(a); // 2: 調用brandNewFun,參數為a,即1
newFun(brandNewFun)(a); // 3-0: 調用newFun,參數為一個箭頭函數brandNewFun(注意這個函數是作為參數的,此時這個函數沒有被調用)
// 5-1: 函數newFun的調用已經結束,并且它返回了一個匿名函數,且我們立即調用了這個匿名函數,參數為a,即1,因此這里輸出1
// 6-0: 函數fun的調用已經結束,該函數沒有返回任何值
}
fun(1); // 0-0: 調用fun,參數1
// 6-1: 函數fun的調用已經結束,腳本結束
添加回答
舉報