🐙

即時関数

に公開
2

即時関数について備忘録。

即時関数とは、定義した直後に一度だけ実行される関数のことです。
英語での略称は、IIFEです。

即時関数の大きな特徴は、

  1. 関数を定義した直後に自動で実行されるため、結果をすぐに得られること。よって、後から関数を呼び出す必要がありません。
  2. 呼び出し元に返ってくるのは、関数定義ではなくてreturn文に続く戻り値です。
  3. 内部の関数や変数を見られないため、スコープの汚染を防げることです。

普通の関数は、以下のように定義した後に呼び出して実行されます。

function subtract(a, b) { // 関数を定義
    return a - b;
}

subtract(5, 1); // 定義後に呼び出し

即時関数の一番一般的な書き方としては、まずは関数宣言を丸括弧で囲い、その後に実行する引数を渡します。
先ほどのサンプルコードで書いた関数を、即時関数に書き換えてみました。

(function(a, b) {
    console.log(a - b);
})(5, 1); // 定義した直後に自動で実行

関数式の場合、最後に丸括弧が付かなくてもエラーが発生することがありません。

const result = function() {
    console.log('Hello!');
}

では、即時関数はどのようなときに使うのでしょうか?
それは、関数スコープを利用して関数の中でしか使えない変数や関数と、関数の外で使える変数や関数を明確に区別したいときに使います。
ざっくり言うと、スコープを汚染しないための対策です。

また、constを使うために即時関数を使うことも多いです。下のサンプルコードをletからconstへ変更しました。

// aは関数の外で使える変数で、functionの中にある変数や関数など(console.log()とか)は関数の中でしか使えない
const a = (function() {
    const privateValue = 'Vietnam'; // 関数の中でしか使えない
    const publicValue = 'Thai';

    function privateFunction() {
        console.log('privateFunctionです');
    }
    function publicFunction() {
        console.log('publicFunctionです');
    }

    // returnに続くオブジェクトが、変数aに格納されるため、外から呼び出すことができる。
    return {
        publicValue,
        publicFunction
    }
})();

console.log(a.privateValue); // undefined
console.log(a.privateFunction); // undefined

console.log(a.publicValue); // Thai
// publicFunction() { console.log('publicFunctionです'); }
console.log(a.publicFunction);

余談
丸括弧()について

  1. 関数の実行をする役割があります。
  2. グループ化演算子。計算の順序を指定できます。(小学校で習います)

参考リンク
JavaScriptで即時関数を使う理由
【JS】ガチで学びたい人のためのJavaScriptメカニズム 30. 即時関数

ご指摘があったので訂正&追記をさせていただきました。

Discussion

junerjuner

グローバルスコープを汚染しないための対策です。

グローバルに限らず スコープを不必要に汚さない為ですね。

むしろ const を使うために即時関数を使うほうが多いです。
汚したくないだけならこれでいいので

let hoge = `fuga`
{
   let hoge = `piyo`
}
console.log(hoge) // -> fuga
YusukeYusuke

ご指摘ありがとうございます。
グローバルスコープだけでなく、ほかの種類のスコープも汚さないためなんですね!
constを使うために即時関数を使うほうが多いということも覚えておきます!

内容を更新&変更させていただきました!