JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

匿名関数とIIFEを使ったJavaScriptのカプセル化手法

オブジェクト指向プログラミング言語では、privateフィールドなどの機能を使ってデータ隠蔽(カプセル化)を行い、クラスの内部構造を外部から隠すことができます。一方、JavaScriptには、内部の処理を隠蔽・カプセル化するための組み込みサポートが従来存在しませんでした。

そこで役立つのが匿名関数です。匿名関数を活用することで、JavaScriptでもカプセル化を実現できます。実際に例を見てみましょう。

通常のコードの問題点

const HIDDEN_CONST = 100;
function fnWeWantToHide(x, y) {
    return (x + y) * HIDDEN_CONST
}
console.log(fnWeWantToHide(1, 2))

上記のようにコードをグローバルスコープに直接記述すると、HIDDEN_CONSTfnWeWantToHide といった名前がグローバル名前空間に露出し、他のスクリプトとの名前衝突など「グローバル名前空間の汚染」を引き起こしてしまいます。

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_CONSTfnWeWantToHide は関数式のスコープ内に隠されます。関数も定数もグローバル名前空間を汚染しなくなり、外部からアクセスできない「非公開」の状態が実現できます。

補足:モダンJavaScriptでの代替手段

なお、近年のJavaScriptでは、ESモジュール(ファイル単位のスコープ)やクラスのprivateフィールド(#fieldName)といった言語機能が使えるため、より明示的にカプセル化を行うことも可能です。ただし、IIFEは古い環境でも動作する軽量なテクニックとして、ライブラリ開発やレガシーコードの保守などで今なお広く活用されています。

  1. JavaScriptのimportで波括弧「{}」を使う理由とは?名前付きエクスポートの基本をわかりやすく解説

    JavaScript(ESモジュール)でモジュールを読み込む際、import 文に波括弧 { } を付けるかどうか迷ったことはありませんか?実はこの波括弧は、名前付きエクスポート(named export)を読み込むために必要な記法です。本記事では、実際のコード例を使いながら、{ } の役割と使い方を詳しく解説します。 importで { } を使う場面とは JavaScriptのESモジュールでは、エクスポート方法によって読み込み側の書き方が変わります。 名前付きエクスポート:export { 関数名 } のようにエクスポートされたものを読み込む場合は、import { 名前 } fro

  2. JavaScriptの匿名ラッパー関数(IIFE)とは?使い方を徹底解説

    匿名ラッパー関数(Anonymous Wrapper Function)は、コードスニペットやJavaScriptライブラリ、個々の関数などを包み込むために使われる手法です。コードの可視性や名前空間(namespace)を制御することで、他のライブラリや外部スクリプトとの名前の衝突・競合を防ぐことができます。 この目的のために広く利用されているのが、IIFE(即時実行関数式:Immediately Invoked Function Expressions)です。IIFEは定義されたその場で即座に実行される関数式であり、関数内部で宣言された変数は外部からアクセスできないため、グローバル名前空間を