First thing to consider is that in JavaScript functions are first class objects, which means that they can be assigned to variables and passed as arguments to other functions in the same way as you would with a string or a number or an array or etc ...
So it's perfectly natural to do something like this:
var minhaFuncao = function( mensagem ) {
console.log( mensagem );
};
// ou...
var minhaOutraFuncao = funcaoQueFazAlgumaCoisa;
function funcaoQueFazAlgumaCoisa( mensagem ) { console.log( mensagem ); }
And then this:
minhaFuncao( "Chamando minhaFunção!" );
// ou...
minhaOutraFuncao( "Chamando minhaOutraFuncao" );
// ou...
funcaoQueFazAlgumaCoisa( "Chamando funcaoQueFazAlgumaCoisa" );
With this in mind, consider the following function:
function passeMeUmaFuncaoQualquer( mensagem, umaFuncaoQualquer ) {
umaFuncaoQualquer( mensagem );
}
The function above expects to receive as a first argument a string and as a function, then we could invoke it as follows:
passeMeUmaFuncaoQualquer( "Olá, Mundo!!!", function( msg ) { console.log( msg ) } );
// ou...
function umaFuncaoQualquer( msg ) {
console.log( msg );
}
passeMeUmaFuncaoQualquer( "Olá, Mundo!!!", umaFuncaoQualquer );
And your self does this:
passeMeUmaFuncaoQualquer( "Olá", "Mundo" );
It will generate an error, because it would be the same thing to do:
"Mundo"();
And you can not call a string, right?
Now, if I do the way you've demonstrated:
passeMeUmaFuncaoQualquer( "Olá, Mundo!!!", umaFuncaoQualquer() );
What happens is that I invoking umaFuncaoQualquer
and passing the value returned by it (whatever it is) as the second argument of passeMeUmaFuncaoQualquer
, which generates an error.