Como a maior parte das pessoas eu tambem tentei entender o codigo na cabeça, mas essa forma não foi melhor para min. Na forma que eu fiz, fui colocando comentarios do lado de cada função desecrevendo que cada uma fazia:
`
function pulaLinha() {
  document.write("<br>");
}
function mostra(frase) {
    document.write(frase);
    pulaLinha();
}
function a(texto) {
    return "(" + texto + ")";     // **( texto )**  -> Essa function vai retornar o paramêtro entre parenteses.
}
function b(texto) {
    return "@" + texto + "@";    // **@ texto @ ** -> Essa function vai retornar o paramêtro entre @'s.
}
function c(nome, sobrenome)  // -> Essa function é usada para receber o nome e o sobrenome.
{
    return b(nome + " " + a(sobrenome));     
}'
- Agora vamos entender o que cada function faz por partes :' function C ( nome e sobrenome entre parênteses) OK - Porem dentro da function C antes de retornar o nome e sobrenome entre perênteses aparece - function B @ + texto +@ que concatena @ no começo e no fim do texto, como a function B esta fora dos parênteses na function C, por enquanto temos o seguinte resultado: @(nome + " " A(sobrenome))@;
' Agora notamos que ao concatenar o sobrenome vimos que a function A "(" +texto + ")"e concatenada junto com o sobrenome, e a function A coloca parenteses entre o texto,temos o seguinte resultado:
' @(nome+ "(sobrenome))@
' var resultado = c("Flávio", "Almeida"); -> Agora vamos colocar o que a variável resultado atribuiu a function C.
mostra(resultado);
' @Flavio(Almeida)@
' - Uma dúvida que eu tive era do porque o Flavio já não começava com parenteses já que dentro da variável na function c ele tem parentes. E ele não começa com parenteses porque na variável ele esta entre parenteses, para mostrar que "Flavio" e o 1 parâmetro da function c e "Almeida" e o 2 parâmetro.
Pra min ficou mais claro dessa forma.
 
             
             
             
            