假設我有一個函式
function item(phone){
return function(money){
console.log(phone + money);
}
}
item(samsung)(100)
可以得到samsung+100
想請問
item(samsung)(100)是呼叫item函式後,依照順序傳送兩個參數進去函式的意思嗎?
不太理解 為什麼 item(samsung)(100) 可以讓 item返回samsung+100
item函式回傳的是一個 function,內容是
function(money){
console.log(phone + money);
}
所以item(samsung)(100)的意思是呼叫item並傳入samsung後,取得回覆的function,之後再直接使用它並傳入100,跟下面的寫法意思是ㄧ樣的。
const fun2 = item(samsung);
fun2(100);
比較需要注意的是,此時這個函式的命名空間中具備phone這個變數,所以可以於function中使用phone。
JS是一級函式語言,function可以放到變數中也可以當回傳值
item(samsung) 取得一個匿名 function
之後又立馬呼叫這個匿名 function
這是一個閉包的概念。
所謂閉包就是一段函式裡面包著另外一段函式,而這個被包著的函式,可以不斷取用外層的變數、參數來使用,這樣的目的是在限制變數的作用域、變數的記憶體釋放,因為跳出函式久無法取得相關的變數、參數。
以你上述的例子來說(我微調了一下)
function item(phone){
console.log('phone', phone); // 100
return function(money){
console.log('money', money) // 100
console.log(phone + money);
}
}
item(100)(100);
呼叫 item 函式的第一個括號,是執行外層函式,因此如果傳入100,可以發現第一個參數,也就是phone的值,就會變成100。
而後面的第二個括號,就是用來執行裡面被return的那個內層的函式。
所以你如果使用console.log(item()),得到的就會是被return的函式,也就是內層的函式。
ƒ (money) {
console.log('money', money);
console.log(phone + money);
}
當然要執行第一個函式時,可以把他指定給一個變數,像這樣
let myMoney = item(100);
myMoney(100);
這個myMoney執行的就是被return的第二個函式。
如果我回答的有誤,希望有好心人可以糾正我一下