declaração da função no ES6 escopo em nível de bloco

fundo

ES5 por causa da ausência de escopo em nível de bloco, por isso, se disposições ES5 não pode ser declarada tal função bloco, mas para compatibilidade com todos os principais navegadores e não é estritamente em conformidade com esta disposição.

ES6 quando o escopo de nível de bloco é introduzida, a função especificada na instrução em nível de bloco é alcance equivalente a deixar variáveis de declaração usando o mesmo. Mas também porque os problemas de compatibilidade do navegador, a explicação padrão alcançar navegador pode não cumprir integralmente com as suas acções, como segue:

  • Ele permite que domínio de nível bloco agindo declaração da função.
  • declaração da função é semelhante a var, isto é, será promovido a chefe de escopo global ou extensão função.
  • Enquanto isso, a declaração função será promovido a chefe de escopo em nível de bloco está localizado.
if (false) {
  function a() {}
}
console.log(a);

A saída acima undefinedindica que os dois acima, é um nível de bloqueio permite âmbito declaração de função, uma declaração é semelhante ao nível de bloco âmbito var.

if (true) {
  console.log(a);
  function a() {}
}

função de saída de um, o que indica que o Artigo III: declaração da função será promovido para a cabeça onde o escopo em nível de bloco.

Perguntas e informações

Existente teoria acima não é suficiente para explicar o seguinte fenômeno:

var a;

{
  a = 5;
  
  function a() {}
  
  a = 0;
  
  console.log(a);
}
console.log(a);

cromo versão mais recente da saída é : primeira saída do console é a 0segunda saída do console é 5.

Obter o código acima com base em vários fenômeno irracional conhecido sob a teoria primeiros três declarações:

  1. Primeiro, pouco trabalho tinha conhecido o seguinte código:
{
  function a() {}
}

console.log(a);

Onde a é uma função de impressão, a penetração do escopo de nível de bloqueio. acima não explicar este fenómeno.

  1. a = 0;Atribuição não afetou o bloco de um externo.

Duas questões explicado acima, precisamos de informações adicionais (informação de louvor alta stackoverflow respondeu, em referência ao link original):

function enclosing() {
  {
     function compat() {}
  }
}

// works the same as

function enclosing() {
  var compat₀ = undefined; // function-scoped
  {
     let compat₁ = function compat() {}; // block-scoped
     compat₀ = compat₁;
  }
}

Em face do conceito de bloco de declaração função adicional introduzida, mais clareza de explicação do subjacente feito.

Em primeiro lugar, a introdução de si informações adicionais, existem alguns problemas. Menos função elevou ao topo do escopo bloco atual, acho que deve ser modificado da seguinte forma:

function enclosing() {
  var compat₀ = undefined; // function-scoped
  {
     function compat() {}
     let compat₁ = compat; // block-scoped
     compat₀ = compat₁;
  }
}

Isto irá corrigir o problema não é a melhora da função.

adivinhar

De acordo com o conhecimento suplementar adicional juntamente com sua imaginação pegue os seguintes resultados:

var a₀;

{
  // 这部分被提升
  function a() {}
  let a₁ = a;
  a₀ = a;
  // 这部分被提升END
  
  a₀ = 5;
  
  a₁ = 0;
  
  console.log(a₁);
}
console.log(a₀);

a₀ e a₁ são um avatar diferente em diferentes locais.

referência

Publicado 48 artigos originais · ganhou elogios 52 · vê 50000 +

Acho que você gosta

Origin blog.csdn.net/letterTiger/article/details/102840601
Recomendado
Clasificación