JS IIFE


IIFEとは?


Immediately Invoked Function Expressions.
関数の定義時にすぐに呼び出されるインスタント実行関数.
即時実行関数は1回のみ呼び出され、再呼び出されません.

どのように使いますか。

(function () { 
  console.log('IIFE') 
})(); // IIFE

(function () { 
  console.log('IIFE2') 
}()); // IIFE2
  • は、このようにして関数文字として使用することができる.記名も匿名関数も可能です.
  • 文字に加えて、関数の前に演算子を付けて、関数の前にセミコロンを付けて値と連続した値で評価しないようにすることもできます.
    *ただし、このメソッドは矢印関数では使用できません.
  • どうして小包を使いますか。


    function(){ }キーワードを使用すると、jsコードを解釈する解析器は、関数宣言(statement)として認識するからである.上の図に示すように、()パッケージを使用して実行しないとエラーが発生します.
    文はjs解釈器を示し、それを消去するので、「値」として保持されません.
    そのため、
  • 変数、または
  • に割り当てられます.
  • ()で
  • を包む
    関数宣言ではなく、関数式であることを明示的に示す必要があります.

    なぜ使うのですか?長所は?


    一度だけ実行される関数の場合は使用します。


  • 関数iifetestを再実行すると、エラーが表示されます.
  • の例は、初期画面のロード時に実行される関数のみを使用できます.
  • 関数の戻り値を変数に直接割り当てるために使用します。

  • 関数式(Function Expression)は、関数を定義し、変数に関数を格納および実行します.
    -次の図に示すように、一般関数を変数に割り当てて式にし、関数addFuncをコンソールに印刷すると、関数addから返される値がコンソールに印刷されることがわかります.
    -関数addをコンソールで撮影すると、関数自体が表示されます.
  • しかし、これらのプロセスを実行することなく、関数定義を直ちに実行し、直ちに実行する.つまり、関数自体を保存せずに、すぐに実行して戻り値を取得するだけで使用できます.
    -addFunc2の値4がコンソールに印刷されていると判断できますが、add2関数が定義されていないというエラーが発生しました.
  • 不要なグローバル変数と関数の作成を回避します。全局計を汚染しなくてもいいです。

  • 戦区に発表された変数と関数は重複する可能性がある.このような衝突を防ぐために使用されます.
  • エンクロージャと一緒に使用すると、プライベートデータを使用できます。

    const counter = (() => {
      let num = 0;
        
      return {
        increase: () => num++,
        decrease: () => num--,
      }
        
    })();
    console.log(counter.increase()); // 1
    console.log(counter.increase()); // 2
    console.log(counter.increase()); // 3
    console.log(counter.decrease()); // 2
    console.log(counter.num); // undefined !!! 접근할 수 없음 !
    console.log(counter); 
    /* [object Object] {
    	increase: () => number++,
        decrease: () => num--
    	} */

    適用


    IIFEを直接使用したことがない場合は,再帰アルゴリズムを解き,使用したコードを添付してみる.
    指定した文字列を配列形式で返すときに作成できる図のアルゴリズムの問題.斬新です!anagram関数は、後で再帰的に実行される関数であるため、IIFEとして使用することができる.
    function allAnagrams(string) {
    
      let obj = {};
    
      (function anagram (ana, str) {
        if (str === '') { obj[ana] = 1; }
    
        for (let i = 0; i < str.length; i++) {
          anagram(ana + str[i], str.slice(0, i) + str.slice(i + 1));
        }
      })('', string);
    
      return Object.keys(obj);
    };