JavaScriptの閉鎖🎆


おい、インターネット上の仲間●'◡'●)
現在、閉鎖について話す時間です.

閉鎖とは
クロージャは、外部関数が返された後でも、その外部関数スコープにアクセスできる関数です.これは、関数が終了した後でさえ、クロージャが変数とその外部関数の引数を覚えてアクセスすることを意味します.
クロージャに飛び込む前に、まず語彙のスコープを理解しましょう.

語彙スコープとは何か
JavaScriptの語彙スコープまたは静的スコープは、ソースコード内の物理的位置に基づいて変数、関数、およびオブジェクトのアクセス可能性を表します.例えば、
let a = 'global';
  function outer() {
    let b = 'outer';
    function inner() {
      let c = 'inner'
      console.log(c);   // prints 'inner'
      console.log(b);   // prints 'outer'
      console.log(a);   // prints 'global'
    }
    console.log(a);     // prints 'global'
    console.log(b);     // prints 'outer'
    inner();
  }
outer();
console.log(a);         // prints 'global'
ヒアinner 関数は自身のスコープで定義された変数にアクセスすることができるouter 関数のスコープとglobal スコープ.とouter 関数は、自分自身のスコープとglobal スコープ.
したがって、上記のコードのスコープチェーンは次のようになります.
Global {
  outer {
    inner
  }
}
注意inner 関数はlexical scope of outer function これは順番に、global scope . That’s why the inner function can access the variables defined in outer function and the global scope.
クイズ-テストあなたの知識
以下のコードは何を出力しますか?
var name = 'John'

function greet (name) {  
  return (function () {
    console.log('Hello ' + name)
  })
}

var sayHello = greet(name)

name = 'Sam'

sayHello()
答えはこんにちはジョンです.
はい、私たちがSayHelloを呼び出す前に、名前の値を' sam 'に変更しました.それはあたかも名前の値が' sam 'に再割り当てされる前にキャプチャされたかのようです.
はい、私たちがSayHelloを呼び出す前に、名前の値を' sam 'に変更しました.それはあたかも名前の値が' sam 'に再割り当てされる前にキャプチャされたかのようです.
それはまさに起こったことです.これは活動中の閉鎖です.