ブロックレベルのスコープES6における関数宣言

背景

ES5の規定は、このようなブロック機能が、すべての主要なブラウザとの互換性のために宣言することはできず、厳密にこの規定を遵守していないそうだとすれば理由はブロックレベルのスコープの不在のES5、。

ブロックレベルのスコープが導入されたときにES6は、ブロックレベルの文で指定された関数は、同じを使用して宣言変数をできるように等価な範囲です。しかし、また、ブラウザの互換性の問題から、標準の説明は、ブラウザを完全に遵守していないことがあり得るため、以下のように、彼らの行動に:

  • これは、ブロックレベルのドメイン働く関数宣言することができます。
  • 関数の宣言は、あること、VARに似ているグローバルスコープまたは関数スコープのヘッドに昇格されます。
  • 一方、関数宣言は、スコープが配置されているブロックレベルのヘッドに昇格されます。
if (false) {
  function a() {}
}
console.log(a);

上記出力undefined上記の二つは、ブロックレベルであることを示す文はブロックレベルのスコープVARと同様であり、範囲の関数宣言を可能にします。

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

条IIIことを示す出力機能A:関数宣言は、ブロックレベルのスコープヘッドに昇格されます。

質問と情報

上記の既存の理論は、次のような現象を説明するのに十分ではありません。

var a;

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

出力のクロームの最新バージョンがある:最初のコンソール出力は、0第2コンソール出力されます5

最初の3つのステートメント理論の下で知られているいくつかの不合理な現象に基づいて上記のコードを取得します。

  1. まず、少し作業は、次のコードを知っていました:
{
  function a() {}
}

console.log(a);

印刷の機能、ブロックレベルの範囲の浸透です。上記は、この現象を説明していません。

  1. a = 0;割り当ては、外部のブロックaに影響を与えませんでした。

2つの問題は、我々が(stackoverflowの高い評価からの情報を元のリンクを参照して、答えた)、追加情報を必要とし、上記説明しました:

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

// works the same as

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

追加の関数宣言ブロックの概念の面には、基礎となる済の説明をより明瞭度を導入しました。

まず、追加情報自体の導入、いくつかの問題があります。以下の関数は、現在のブロックスコープ、私は次のように修正されるべきだと思うの一番上に上げ:

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

これは、問題は機能の改善ではありません修正されます。

推測

結合された追加の補足的な知識によると、彼らの想像次のような結果が得られます。

var a₀;

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

a₀とa₁は、異なる場所で異なるのアバターです。

参照

公開された48元の記事 ウォン称賛52 ビュー50000 +

おすすめ

転載: blog.csdn.net/letterTiger/article/details/102840601