iT邦幫忙

0

呼叫函式傳送參數的問題(JS)

假設我有一個函式

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.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
tunin
iT邦新手 4 級 ‧ 2021-04-07 16:52:05

item函式回傳的是一個 function,內容是

function(money){
    console.log(phone + money);
}

所以item(samsung)(100)的意思是呼叫item並傳入samsung後,取得回覆的function,之後再直接使用它並傳入100,跟下面的寫法意思是ㄧ樣的。

const fun2 = item(samsung);
fun2(100);

比較需要注意的是,此時這個函式的命名空間中具備phone這個變數,所以可以於function中使用phone。

了解了,謝謝!

0
koro_michael
iT邦新手 2 級 ‧ 2021-04-07 17:00:09

JS是一級函式語言,function可以放到變數中也可以當回傳值

item(samsung) 取得一個匿名 function

之後又立馬呼叫這個匿名 function

原來是兩次呼叫的意思,謝謝!!

0
iven
iT邦新手 5 級 ‧ 2021-11-18 11:22:06

這是一個閉包的概念。
所謂閉包就是一段函式裡面包著另外一段函式,而這個被包著的函式,可以不斷取用外層的變數、參數來使用,這樣的目的是在限制變數的作用域、變數的記憶體釋放,因為跳出函式久無法取得相關的變數、參數。

以你上述的例子來說(我微調了一下)

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的第二個函式。

如果我回答的有誤,希望有好心人可以糾正我一下/images/emoticon/emoticon08.gif

我要發表回答

立即登入回答