La respuesta a porque el resultado es -2 es sencillo
si traducimos la function a una expresión matemática nos daría como resultado: "A - B = ?" donde A y B son los valores pasados por parámetro y "?" es el resultado de la expresión.
Ahora bien, desglosando un poquito el código podemos ver la siguiente línea que está en tu código:
vemos que a la function restar (la externa) se le esta pasando como primer parámetro el resultado de invocar a restar con los parámetros C y D, y como segundo parámetro le pasamos el resultado de invocar a restar pero con los parámetros D y C (esta vez están invertidos).
Si C es igual a 8 y D es igual a 9 entonces podemos determinar lo siguiente:
Tenemos una resta de A - B con un resultado que sabemos que es -2
ahora el primer parametro (en este caso A) dijimos que es la resta entre C y D, entonces podemos determinar que A = 8 - 9
el segundo parametro ( B en este caso) determinamos que era la resta entre D y C, entonces podemos determinar que B = 9 - 8
Si juntamos todo entonces nos queda algo como esto:
A => 8 - 9 , B => 9 - 8
A - B = - 2 => reemplazamos A y B por los valores correspondientes
(8 - 9) - (9 - 8) = - 2
-1 - 1 = - 2
-2 = -2
Traduciendolo a codigo podriamos tener algo como esto para que se entienda más fácil:
Espero que te haya servido de algo la explicación. Saludos.