Closureについて理解を深める
はじめに
プログラミングを行っていると、しばしば「Closure(クロージャ)」という言葉を耳にすることがある。これまで、なんとなく理解したつもりになっていたが、正直ちゃんと理解しているか自信がなかった。そこで、本記事では、JavaScript を例に、Closure について理解を深める。
Closure とは
Closure は、プログラミングのコンセプトの 1 つであり、主に関数型プログラミングで使用される。
Closure は関数とその関数が宣言されたレキシカルスコープの組み合わせである。これにより、関数は外部のスコープから独立した変数(プライベート変数)へのアクセスを維持することができる。
簡単にいうと、Closure とはある関数から別の関数を返す際に、返された関数が元の関数のスコープにアクセスできるようになる仕組みのことを指す。
Closure の例
言葉で説明するよりも、実際のコードを見た方が理解しやすいと思うので、ここではいくつか Closure の例を記載する。
例 1: 変数をカプセル化する
const counter = () => {
let count = 0;
return {
increment: () => {
count++;
return count;
},
decrement: () => {
count--;
return count;
},
getCount: () => {
return count;
},
};
};
const myCounter = counter();
console.log(myCounter.increment()); // 1
console.log(myCounter.increment()); // 2
console.log(myCounter.decrement()); // 1
console.log(myCounter.getCount()); // 1
上記は、counter
関数を使用してカウンターを作成する例である。この例では、count
はcounter
関数のスコープに閉じているため、外部から直接アクセスすることができない。そのため、increment
、decrement
、getCount
の各関数を通じてのみcount
にアクセスすることができる。
これにより、count
は外部から隠蔽され、外部からの不正な操作を防ぐことができる。
また、counter
関数を実行するたびに新しいcount
変数が生成されるため、複数のカウンターを作成することができる。
const myCounter1 = counter();
const myCounter2 = counter();
console.log(myCounter1.increment()); // 1
console.log(myCounter2.increment()); // 1
console.log(myCounter1.increment()); // 2
console.log(myCounter2.increment()); // 2
例 2: 関数のカスタマイズ
const createGreeting = (greeting) => {
return (name) => {
return `${greeting}, ${name}!`;
};
};
const greetHello = createGreeting("Hello");
console.log(greetHello("Alice")); // "Hello, Alice!"
上記は、createGreeting
関数を使用して挨拶をカスタマイズする例である。この例では、createGreeting
関数がgreeting
を引数として受け取り、name
を引数として受け取る関数を返す。
このようにすることで、1 つの関数から複数のカスタマイズされた関数を作成することができる。
Closure のメリット
-
データのカプセル化: Closure を使用すると、関数外部から直接アクセスできない変数を作成できる。これにより、データのプライバシーを高めることができる。
-
状態の保持: Closure を利用することで、関数が一度実行された後もその状態を保持することができる。これは、カウンタや設定情報の保持などに有用である。
-
関数のカスタマイズ: Closure によって、特定の引数や設定を持つ特殊化された関数を容易に作成することができる。
まとめ
Closure は JavaScript の非常に強力な特性の一つであり、一見すると複雑に思えるかもしれないが、基本を理解すればコードのカプセル化、状態保持、カスタマイズといった面で大きな利点をもたらす。
Closure を利用し、より安全で柔軟なコードを書いていこう。
Discussion