2022.12.19目次スコープチェーンとはスコープチェーンの定義スコープが複数階層で、連なっている状態。スコープが複数階層になっている場合は、一番内側から変数を探しに行き、見つかった段階でその変数を取得する。fn2();}fn1();グローバルスコープとスクリプトスコープの場合グローバルスコープは、スクリプトスコープより外側のスコープ。fn2();}fn1();letの場合はエラーが出るのでまだわかりやすい。varの場合で、if文などブロックで囲まれているときに、varのホイスティングが働いてしまうため、aはundefinedとなる。fn2();}fn1();クロージャーとはクロージャーの定義レキシカルスコープの変数を関数が使用している状態。内側に定義されている関数から、レキシカルスコープの変数への参照を保持している状態をクロージャーという。関数f2から、変数bに対してレキシカルスコープの値を参照しに行っている。関数の中でnumを宣言しているため、常にnumが0となる。結果、1が3回表示される関数が呼ばれるたびではなく、グローバルコンテキストが実行されるタイミングで初期化を行う。この状態ではnumの変更が可能となっている。関数の内部に変数を持ちながらも、外部からはアクセスできないようにしたい。incrementFactoryの実行increment();increment();increment();関数の外側からはnumにアクセスすることができないため、書き換えられる心配がない。numの初期化はincrementFactoryが実行されたタイミングでのみ行われる。異なる結果を返す関数を動的に作成することができる。add5(addNumberFactory(5))にはvalueの引数が取れるので、10を渡す。