In realtà non è così complicato se lo fai passo per passo. Lavoriamo da dentro e fuori. Calling:
three()
senza un parametro significa che stai passando un valore indefinito come func. Quindi è come dire:
makeNum(3, undefined)
Quando makeNum vede che func non è definito, restituisce num, che è 3.
Quindi abbiamo ridotto questo a:
eight(minus(3))
Ora vediamo come
minus(3)
Esamina. meno vede che il parametro che hai fornito è 3, quindi restituisce una funzione che può accettare un parametro "sinistro" e sottrarre il 3 che abbiamo già fornito da esso. NON viene eseguito. Si trova lì, in attesa di essere chiamato con un parametro "left" in modo da poter sottrarre 3 da esso.
Quindi abbiamo ridotto questo a:
eight(function(left){
return left - 3;
})
Ora vediamo come viene valutato. otto viene chiamato con il parametro func essendo questa funzione:
function(left){
return left - 3;
}
Quindi passa 8 e questa funzione per makeNum quando dice:
makeNum(8, func)
makeNum vede quindi che func è stato fornito (e quindi non è definito) e restituisce func (num) alle otto funzioni, che è lo stesso del passaggio:
8 - 3
torna alle otto funzioni. L'ottava funzione riceve quel valore e poi lo restituisce. Quindi abbiamo ridotto questo a:
5
che viene registrato nella console.