JavaScript ‘içando’

Eu encontrei o içamento de JavaScript e não descobri como esse trecho de código realmente funciona:

var a = 1; function b() { a = 10; return; function a() {} } b(); alert(a); 

Eu sei que a declaração de function como ( function a() {} ) será hasteada para o topo da function b scope mas não deve sobrepor o valor de a (porque declarações de function substituem declarações de variables ​​mas não boot de variables) então eu Espera-se que o valor do alerta seja 10 em vez de 1 !!

    1. O global a está definido para 1
    2. b() é chamado
    3. function a() {} é hasteada e cria uma variável local a que mascara a global
    4. O local a é definido como 10 (sobrescrevendo a function a )
    5. O global a (ainda 1 ) é alertado

    É porque a ordem de compilation / interpretação neste exemplo é um pouco enganosa. A function a () {} linha é interpretada antes de qualquer parte do resto da function ser executada, portanto, no início da function, a tem o valor da function a () {} . Ao reatribuí-lo a 10 , você está reatribuindo o valor de a no escopo local da function b() , que é descartado assim que retornar, deixando o valor original de a = 1 no escopo global.

    Você pode verificar isso colocando alert() ou algo parecido nos lugares apropriados para ver qual é o valor de a em vários pontos.

    (1) JavaScript não possui escopo de instrução de bloco; em vez disso, ele será local para o código no qual o bloco reside.

    (2) A declaração do Javascript de variables ​​em um escopo de function, o que significa que as variables ​​declaradas em uma function estão disponíveis em qualquer lugar nessa function, mesmo antes de receberem um valor .

    (3) Dentro do corpo de uma function, uma variável local tem precedência sobre uma variável global com o mesmo nome. Se você declarar uma variável local ou um parâmetro de function com o mesmo nome de uma variável global, você efetivamente ocultará a variável global .

    seu código é o mesmo que: ( ler comentário )

      

    referência:
    (1) Escopo Variável JavaScript:
    (2) Um exemplo perigoso de içamento de Javascript
    (3) âmbito variável

    Então, no seu código:

     var a = 1; //global a = 1 function b() { a = 10; return; function a() {} //local } b(); alert(a); //global a = 1 
    1. function de declaração de function a(){} é içada primeiro, portanto, no escopo local a é criado.
    2. Se você tiver duas variables ​​com o mesmo nome (uma em outra global em local), a variável local sempre terá precedência sobre a variável global.
    3. Quando você define a=10 , você está definindo a variável local a , não a global.

    Assim, o valor da variável global permanece o mesmo e você recebe, alertado 1

    Quando eu li o mesmo artigo que você fez JavaScript Escopo e Içamento , fiquei confuso também porque o autor nunca mostrou o que os dois códigos de exemplo de abertura são interpretados como no compilador.

    Aqui está o exemplo que você forneceu e o segundo na página:

     var a = 1; function b() { function a() {} // declares 'a' as a function, which is always local a = 10; return; } b(); alert(a); 

    e aqui está o primeiro exemplo na página:

     var foo = 1; function bar() { var foo; // a new local 'foo' variable if (!foo) { foo = 10; } alert(foo); } bar(); 

    Espero que isto ajude