匿名関数とIIFEを使ったJavaScriptのカプセル化手法
オブジェクト指向プログラミング言語では、privateフィールドなどの機能を使ってデータ隠蔽(カプセル化)を行い、クラスの内部構造を外部から隠すことができます。一方、JavaScriptには、内部の処理を隠蔽・カプセル化するための組み込みサポートが従来存在しませんでした。
そこで役立つのが匿名関数です。匿名関数を活用することで、JavaScriptでもカプセル化を実現できます。実際に例を見てみましょう。
通常のコードの問題点
const HIDDEN_CONST = 100;
function fnWeWantToHide(x, y) {
return (x + y) * HIDDEN_CONST
}
console.log(fnWeWantToHide(1, 2))上記のようにコードをグローバルスコープに直接記述すると、HIDDEN_CONST や fnWeWantToHide といった名前がグローバル名前空間に露出し、他のスクリプトとの名前衝突など「グローバル名前空間の汚染」を引き起こしてしまいます。
IIFE(即時実行関数式)による解決策
この問題を回避するには、コード全体をIIFE(Immediately Invoked Function Expression:即時実行関数式)で囲みます。
(() => {
const HIDDEN_CONST = 100;
function fnWeWantToHide(x, y) {
return (x + y) * HIDDEN_CONST
}
console.log(fnWeWantToHide(1, 2))
})()このように書き換えることで、HIDDEN_CONST や fnWeWantToHide は関数式のスコープ内に隠されます。関数も定数もグローバル名前空間を汚染しなくなり、外部からアクセスできない「非公開」の状態が実現できます。
補足:モダンJavaScriptでの代替手段
なお、近年のJavaScriptでは、ESモジュール(ファイル単位のスコープ)やクラスのprivateフィールド(#fieldName)といった言語機能が使えるため、より明示的にカプセル化を行うことも可能です。ただし、IIFEは古い環境でも動作する軽量なテクニックとして、ライブラリ開発やレガシーコードの保守などで今なお広く活用されています。
-
JavaScriptのimportで波括弧「{}」を使う理由とは?名前付きエクスポートの基本をわかりやすく解説
JavaScript(ESモジュール)でモジュールを読み込む際、import 文に波括弧 { } を付けるかどうか迷ったことはありませんか?実はこの波括弧は、名前付きエクスポート(named export)を読み込むために必要な記法です。本記事では、実際のコード例を使いながら、{ } の役割と使い方を詳しく解説します。 importで { } を使う場面とは JavaScriptのESモジュールでは、エクスポート方法によって読み込み側の書き方が変わります。 名前付きエクスポート:export { 関数名 } のようにエクスポートされたものを読み込む場合は、import { 名前 } fro
-
JavaScriptの匿名ラッパー関数(IIFE)とは?使い方を徹底解説
匿名ラッパー関数(Anonymous Wrapper Function)は、コードスニペットやJavaScriptライブラリ、個々の関数などを包み込むために使われる手法です。コードの可視性や名前空間(namespace)を制御することで、他のライブラリや外部スクリプトとの名前の衝突・競合を防ぐことができます。 この目的のために広く利用されているのが、IIFE(即時実行関数式:Immediately Invoked Function Expressions)です。IIFEは定義されたその場で即座に実行される関数式であり、関数内部で宣言された変数は外部からアクセスできないため、グローバル名前空間を