Opa Daniel,
Esse código é um pouco mais complicado de acompanhar pois temos muitas funções chamando outras, dificultando o acompanhamento de parâmetros e valores de retorno.
Vamos por partes. A primeira coisa é guardar na variável resultado
o retorno de c("Flávio", "Almeida")
Dentro de c
, temos
function c(nome, sobrenome) {
//nome = "Flávio"
//sobrenome = "Almeida"
return b(nome + " " + a(sobrenome));
}
Vamos retornar o valor de retorno da função b
com o parâmetro nome + " " + a(sobrenome))
, ou seja, "Flávio" + " " + a("Almeida")
. Mas aqui temos outra função a
no parâmetro, que será avaliada primeiro.
Chamamos a
, na seguinte situação
function a(texto) {
//texto = "Almeida"
return "(" + texto + ")";
}
Portanto a
devolve "(Almeida)"
. Voltamos agora a aplicação de b
, que agora sabemos que será com o parâmetro "Flávio (Almeida)"
Em b
, temos a seguinte situação
function b(texto) {
//texto = "Flávio (Almeida)"
return "@" + texto + "@";
}
Portanto b
retorna "@Flávio (Almeida)@"
.
Recapitulando, a variável resultado
é o retorno dec
, que por sua vez retorna o valor de retorno de b
(com um parâmetro que vem do retorno de a
), que agora sabemos que é "@Flávio (Almeida)@"
.
No final, mostramos na tela o conteúdo da variável resultado
, ou seja, @Flávio (Almeida)@
.
Recomendo que você escreva num papel cada chamada de função com seus argumentos para fixar o raciocínio. É bem fácil se perder.