Pergunta

quando o código I:

var a =
function()
{
    alert("44")
    return function(){alert(33)}
}()();

É esta expressão avaliada na seguinte ordem?

  1. definir a função;
  2. passar seu ponteiro referência a um
  3. a () é chamado
  4. retorno em um novo ponteiro de função
  5. 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

Foi útil?

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.

  1. A função é definida e invocado. alerta ( "44"); acontece como resultado.
  2. A função retorna outra função que também é invocado. alert ( "33"); acontece.
  3. A função mais interna não retorna nada, então um é efetivamente indefinido. typeof uma retorna "indefinido".

Outras dicas

  1. function() { alert("44") return function(){alert(33)} } você define a função
  2. function() { alert("44") return function(){alert(33)} } () você chamar essa função retornar função anônima function(){alert(33)}
  3. function() { alert("44") return function(){alert(33)} }() () você chamada de função retornou, por isso é realmente equivalente a function(){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);} })()()

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top