JavaScriptの即時関数(IIFE)とは?仕組みと使い方をわかりやすく解説
即時関数(IIFE)とは
即時関数とは、定義されたその瞬間に自動的に実行される関数のことです。英語では「Immediately Invoked Function Expression」の頭文字を取って「IIFE」と呼ばれることもあります。
通常の関数は定義しただけでは実行されず、後から呼び出す必要があります。一方、即時関数は定義と同時に一度だけ実行されるため、初期化処理や独立したスコープを作りたい場面で活躍します。
通常の関数との違い
まず、即時関数の基本的な書き方を見てみましょう。
(function() {
var str = "display";
}());
function display() {
// ここでの str は undefined になる
alert(str);
}
上記の例では、変数 str が即時関数の内部で宣言されています。そのため、外側にある display() 関数からは参照できず、alert(str) は undefined を返します。
これに対して、同じ処理を通常の関数で書くと次のようになります。
var str = "display";
function display() {
// これは "display" を返す
alert(str);
}
この場合、str はグローバルスコープで宣言されているため、display() 関数内からもアクセス可能で、alert(str) は「display」という文字列を表示します。
このように、即時関数の中で宣言された変数は外部から見えない「閉じたスコープ」を持つのが大きな特徴です。
引数を渡す即時関数
即時関数には、実行時に引数を渡すこともできます。
var name = 'Amit';
(function(sName) {
alert('Student name = ' + sName);
}(name));
この例では、グローバル変数 name の値が即時関数の引数 sName に渡され、「Student name = Amit」というアラートが表示されます。外部の値を関数内に取り込みながら、グローバル変数への直接依存を避けられる点もポイントです。
即時関数を使うメリット
- グローバル汚染の防止: 関数内で宣言した変数は外部からアクセスできないため、グローバルスコープを汚しません。
- 名前の衝突を回避: 他のライブラリやスクリプトとの変数名・関数名の競合を防げます。
- 初期化処理に最適: ページ読み込み時に一度だけ実行したい処理を簡潔に記述できます。
このように即時関数は、変数のスコープを限定しながら安全にコードを実行するための定番テクニックです。モダンJavaScriptではブロックスコープ(let / const)やモジュールの利用が一般的になりましたが、レガシーコードの理解やライブラリのソースを読むうえで、今なお重要な概念といえます。
-
JavaScriptの部分関数(Partial Function)とは?仕組みと実装例をわかりやすく解説
部分関数(Partial Function)とは、既存の関数を引数として受け取り、それに加えて別の型の引数も同時に受け取れるようにする仕組みです。まず渡された引数の一部を使い、残りの引数を受け取る新しい関数を返します。そして、返された関数が呼び出されるときに、あらかじめ固定しておいた引数とそのときに渡された引数をすべて組み合わせて、元の親関数が実行されます。 この手法は「部分適用(Partial Application)」とも呼ばれ、関数型プログラミングの基本的なテクニックのひとつです。共通する引数を先に束縛しておくことで、処理の再利用性やコードの可読性を高めることができます。 コード例 以下
-
JavaScriptのクロージャとは?仕組みと実装例をわかりやすく解説
クロージャとはJavaScriptにおけるクロージャ(Closure)とは、外側の関数の実行が完了して値を返した後であっても、内側の関数から外側の関数のスコープ(変数)にアクセスできる仕組みのことです。言い換えれば、内側の関数は、外側の関数の変数に対して常にアクセスできるということです。この性質を活用することで、データを外部から直接操作されないように隠蔽したり、関数の呼び出し間で状態を保持する処理を実現したりすることが可能になります。クロージャのサンプルコード以下は、JavaScriptでクロージャを使用した具体的なコード例です。ボタンをクリックすると、クロージャによって保持された値を使って2