funções de auto-invocando
-
03-07-2019 - |
Pergunta
quando o código I:
var a =
function()
{
alert("44")
return function(){alert(33)}
}()();
É esta expressão avaliada na seguinte ordem?
- definir a função;
- passar seu ponteiro referência a um
- a () é chamado
- retorno em um novo ponteiro de função
- a () é chamado novamente
e se assim por que eu tenho um erro de sintaxe se eu fizer:
function()
{
alert("44")
return function(){alert(33)}
}();
o intérprete quer um operando esquerdo primeiro ...
mas esta sintaxe obras:
(
function()
{
alert("44")
return function(){alert(33)}
};
)()
o parêntese exterior o que significa ???
Graças
Solução
É a sintaxe da linguagem. Se você quiser no local executar uma função anônima, você deve colocá-lo entre parênteses.
JS tem esses casos extremos, onde a sintaxe é mais estranho do que o esperado. Tomemos por exemplo, evaling uma cadeia que tem um JSON não funciona a menos que seja envolvido com parens.
// Wrong
eval("{ ... }");
// Right
eval("({ ... })");
É a sintaxe da linguagem.
Dito isso, eu acho que (e este é estritamente IMHO), os passos que esbocei não são precisos.
- A função é definida e invocado. alerta ( "44"); acontece como resultado.
- A função retorna outra função que também é invocado. alert ( "33"); acontece.
- A função mais interna não retorna nada, então um é efetivamente indefinido. typeof uma retorna "indefinido".
Outras dicas
-
function() { alert("44") return function(){alert(33)} }
você define a função -
function() { alert("44") return function(){alert(33)} }
()
você chamar essa função retornar função anônimafunction(){alert(33)}
-
function() { alert("44") return function(){alert(33)} }()
()
você chamada de função retornou, por isso é realmente equivalente afunction(){alert(33)}()
Assim, toda a execução é equivalente a:
alert("44"); alert(33);
i apenas aprender funções auto-invocando também.
e eu acho que o código deve ser
3. (function() { alert("44"); return function(){alert(33);} })()()