Pergunta

Será que a colocação de uma função ter um efeito sobre o desempenho de encerramentos dentro do escopo? Se sim, onde é o lugar ideal para colocar essas funções? Se não, é a associação implícita por motivo suficiente fechamento para colocar uma função em outro lugar logicamente?

Por exemplo, se foo não contar com o valor de localState , que o fato de que localState é acessível a partir de foo ter implicações quanto à foo 's tempo de execução, uso de memória, etc.?

(function(){
    var localState;

    function foo(){
        // code
    }

    function bar(){
        // code
        return localState;
    }
})();

Em outras palavras, isso seria uma escolha melhor, e se assim porquê?

(function(){
    function foo(){
        // code
    }

    var localState;

    function bar(){
        // code
        return localState;
    }
})();

Darius Bacon sugeriu abaixo que as duas amostras acima são idênticas desde localState pode ser acessado em qualquer lugar dentro do bloco. No entanto, o exemplo que se segue, onde foo é definido do lado de fora do bloco pode ser um caso diferente. O que você acha?

function foo(){
    // code
}

(function(){

    var localState;

    function bar(){
        // code
        foo();
        return localState;
    }
})();
Foi útil?

Solução

Cada função em JavaScript é um fechamento. O tempo de execução para resolver o valor de uma variável só é incorrido se a variável é referenciada pela função. Por exemplo, neste exemplo de função y captura o valor de x, mesmo que x não é referenciado diretamente pelo y:

var x = 3;
function y() eval("x");
y();
3

Outras dicas

Ambos esses trechos são equivalentes, porque eles são ambos definidos na (mesma) ambiente da função anônima que você está criando. Eu acho que você seria capaz de acesso localState de foo de qualquer forma.

Dito isto ... se você tem quantidades absurdas de variáveis ??do ambiente que você está criando, em seguida, o tempo de execução do foo pode ser afetada, como pesquisas variáveis ??provavelmente vai demorar mais tempo. Se há toneladas de variáveis ??que já não uso na função de definir foo, e foo não precisa deles também, então foo vai levá-los a não ser coleta de lixo, de modo que também poderia ser um problema.

Dog, eu espero que a ordem das declarações seria algo que os intérpretes de JavaScript seria abstrair. Em qualquer caso, se houver uma diferença de desempenho, seria tão mínimo quanto para tornar esta uma criança do poster para os males da otimização prematura.

Eu não acho que haveria qualquer sobrecarga de desempenho, como java script não usa a noção de pilha função. Ele suporta escopo lexical. O mesmo estado é levada adiante entre as chamadas de fechamento. Em uma nota lateral, no seu exemplo você não parecem estar a executar quaisquer declarações!

O escopo de uma var ou função declaração é o bloco inteiro aparece em, independentemente de onde no bloco a declaração é; por isso estaria surpreendendo para que possa afectar a eficiência.

Ou seja, ele não deve importar se a "função foo ()" é antes ou depois de "var localState" dentro deste bloco. É pode importa se "função foo ()" é neste bloco ou um um delimitador (se ele pode ser içado para um âmbito maior, porque ele não usa qualquer Local variáveis); que depende de detalhes de seu compilador Javascript.

Em seus exemplos a diferença não importa realmente. Mesmo se foo está no escopo global você não terá um problema.

No entanto, é útil ter em mente que se você usar o estilo de atribuição de funções para variáveis ??para declarar suas funções na ordem em que eles são declare pode se tornar um problema.

Para uma idéia melhor, tente os dois exemplos a seguir:

CheckOne();
function CheckOne() {
    alert('check...check one.');
}

CheckTwo();
var CheckTwo = function() {
    alert('check...check two.');
};

A única diferença entre o segundo eo primeiro é o estilo que eles usam para declarar suas funções. A segunda gera um erro de referência.

Felicidades.

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