É um objeto cujo qual suporta todas operações disponíveis para outros objetos. Ele pode ser:
function Identifier ( FormalParameterList(opt) ) { FunctionBody }
function Identifier(opt) ( FormalParameterList(opt) ) { FunctionBody }
// Expressão aritmética
1 + 1 * 2;
// Expressões de atribuição
significadoDaVida = origemDoUniverso = 42;
//FD - Statement obrigatoriamente começa com a keyword "function"
function a(){}
//FE - parte de uma expressão de atribuição
var b = function(){};
Immediately-Invoked
name
) de uma FE só referencia a função dentro de seu próprio escopo.//NFE - Named Function Expression
var funcRef = function identificador(naoRecursar) {
console.log('fui chamado com sucesso.');
if (naoRecursar) return;
identificador(true); //válido
funcRef(true); //válido
};
funcRef(); //válido
console.log( funcRef.name ); //"identificador"
identificador(); //erro
var retorno = (function() {
return 42;
}());
console.log( retorno ); //42
(function(){}());
(function(){})();
Um Statement que começa com a keyword function é interpretado como FD.
function(){} //erro - FD necessita de um identifier
function funcName(){}() //erro - FD não pode ser imediatamente invocada
//function dentro de uma expressão de agrupamento - FE
(function(){}());
!function(){}();
+function(){}();
~function(){}();
//etc.
var foo = function() { //parece que estamos atribuindo uma FE a foo
//muitos linhas e scrolls depois...
}(); //SURPRISE MOTHERFUCKER - É UMA IIFE
var foo = (function() { //function entre parenteses? Deve ser uma IIFE
//...
}());
fd(); //válido
function fd(){}
fe(); //erro
var fe = function(){};
if (true) {
function fd(){ return 1; }
} else {
function fd(){ return 2; }
}
console.log( fd() );
var fe;
if (true) {
fe = function(){ return 1; }
} else {
fe = function(){ return 2; }
}
console.log( fe() );
//IINFE
(function timerContador(i) {
if (i <= 10) {
console.log(i);
setTimeout(function() {
timerContador(i + 1);
}, 500);
}
}(1));
var estouPoluindoEscopoGlobal = true;
function maisPoluicaoGlobal() {}
(function() {
var estouPoluindoEscopoGlobal = false;
function existoSomenteDentroDestaIIFE() {}
}());
for (var i = 0; i < 3; i++) {
(function(i) {
setTimeout(function() {
console.log(i);
}, 1);
}(i));
}