TypeScriptでグローバルスコープを汚染せずに変数を管理することは、複数のモジュールやライブラリを使用する際に非常に重要です。グローバルスコープに意図せず変数が追加されると、他のコードとの名前衝突や予期しない動作が発生するリスクがあります。特に大規模なプロジェクトや長期的なメンテナンスを要するシステムでは、この問題が顕著になります。本記事では、TypeScriptでグローバルスコープを汚染しないための変数管理方法を様々な手法と共に紹介し、実践的な解決策を提供します。
グローバルスコープとは
グローバルスコープとは、プログラム全体からアクセス可能な変数や関数が存在するスコープを指します。グローバルスコープ内の変数は、どのモジュールや関数からも参照・操作できるため、コードの再利用性や保守性が損なわれる可能性があります。特に、複数のモジュールや外部ライブラリを使用するプロジェクトでは、変数名の重複や意図しない変数の上書きが問題となることがあります。このようなグローバルスコープの汚染は、予期しないバグやセキュリティリスクを引き起こすため、慎重に管理する必要があります。
TypeScriptでのスコープ管理の基本
TypeScriptでは、スコープの管理がJavaScriptと同様に重要です。変数や関数がどこで定義され、どこからアクセスできるかを適切に制御することで、コードの安定性や保守性が向上します。TypeScriptでのスコープ管理の基本的なルールは次の通りです。
ブロックスコープと関数スコープ
TypeScriptでは、let
やconst
を使って宣言された変数はブロックスコープ({}
で囲まれた範囲)に限定され、var
を使った場合は関数スコープが適用されます。ブロックスコープを適切に使用することで、グローバルスコープへの意図しない変数の流出を防ぐことができます。
ローカルスコープの優先利用
変数はできるだけ関数やブロック内に閉じ込め、ローカルスコープを活用することが推奨されます。これにより、グローバルスコープでの名前衝突を避け、意図しないバグを防ぐことができます。
TypeScriptの型安全性
TypeScriptでは、型定義を行うことで変数の扱いを厳密にし、誤ったデータの代入や操作を防ぎます。これにより、スコープ内の変数が適切に使用されることを保証し、バグの発生を減らすことが可能です。
モジュールシステムの利用によるスコープの管理
TypeScriptでは、モジュールシステムを活用することで、グローバルスコープを汚染せずに変数や関数を適切に管理できます。モジュールを使うことで、コードを論理的に分割し、他の部分から隠蔽することが可能になります。
ESモジュールの導入
TypeScriptはESモジュールをサポートしており、import
やexport
を使用してモジュール間でデータをやり取りできます。これにより、各モジュールは独自のスコープを持ち、他のモジュールと名前衝突することなく変数を管理できます。
// moduleA.ts
export const myVariable = "Hello";
// moduleB.ts
import { myVariable } from './moduleA';
console.log(myVariable); // "Hello"
デフォルトエクスポートと名前付きエクスポート
TypeScriptでは、モジュールごとに複数の方法でデータをエクスポートできます。export default
を使用してモジュール全体をエクスポートすることもできれば、個別に名前付きエクスポートを行うことも可能です。これにより、必要なものだけを外部に公開し、不要なものはモジュール内に隠しておくことができます。
// moduleC.ts
const internalVariable = 42; // これはモジュール外に公開されない
export const publicVariable = "公開変数";
モジュールによるコードの分離
モジュールシステムの利用により、各モジュールは自分の責務に集中し、他のモジュールに影響を与えないように設計されます。この分離によって、メンテナンス性が向上し、バグの発生を抑制できます。また、不要なグローバルスコープの汚染を回避し、複数人での開発でも問題が起こりにくくなります。
IIFE(即時実行関数式)の活用
IIFE(Immediately Invoked Function Expression)は、関数を定義した直後に即座に実行するJavaScriptのテクニックです。TypeScriptでもこの手法を使用することで、グローバルスコープを汚染せずに変数や関数を管理することが可能です。IIFEを使うことで、変数や関数をローカルスコープに閉じ込め、外部からのアクセスや干渉を防ぐことができます。
IIFEの基本的な構文
IIFEは、無名関数を定義して即座に実行するため、次のような構文になります。
(function() {
const privateVariable = "I am private";
console.log(privateVariable); // "I am private"
})();
この例では、privateVariable
はIIFEの内部でのみ有効であり、外部からはアクセスできません。これにより、グローバルスコープを汚染せず、変数が他のコードと衝突するリスクを回避できます。
IIFEを使ったスコープの分離
IIFEを活用することで、特定の機能や処理を独立したスコープで実行することができます。これは、特にモジュール化されていないコードや、複数のライブラリが混在する状況で役立ちます。
(function() {
const localData = "ローカルデータ";
function processData() {
console.log("データを処理中: " + localData);
}
processData();
})();
このコードでは、localData
とprocessData
はIIFE内部に閉じ込められており、他の部分からはアクセスできません。このように、IIFEは外部との依存関係を減らし、グローバル変数の競合を防ぐことができます。
TypeScriptとIIFEの組み合わせ
TypeScriptでIIFEを使用すると、型チェックやインターフェースも活用でき、より安全で予測可能なコードを書けます。例えば、次のようにインターフェースと組み合わせて使用することができます。
interface User {
name: string;
age: number;
}
(function() {
const user: User = { name: "Alice", age: 25 };
console.log(`User: ${user.name}, Age: ${user.age}`);
})();
この方法では、ローカルスコープ内で型チェックも行われるため、より堅牢なコードを保ちながらグローバルスコープの汚染を防ぐことができます。
namespaceを使用したスコープの管理
TypeScriptでは、namespace
(旧称:内部モジュール)を使ってスコープを分離し、グローバルスコープの汚染を防ぐことができます。namespace
は、複数の変数や関数、型を一つの論理的なグループにまとめ、外部に公開する部分と隠蔽する部分を明確に分けるための機能です。
namespaceの基本構文
namespace
を使用することで、コードをモジュール化せずとも論理的に整理することができます。以下はnamespace
の基本的な使い方です。
namespace MyApp {
export const appName = "TypeScript App";
const privateData = "This is private";
export function getAppName() {
return appName;
}
function internalFunction() {
console.log("This function is private");
}
}
この例では、appName
とgetAppName
はexport
されているため、namespace
外部からもアクセス可能ですが、privateData
とinternalFunction
はnamespace
内に閉じ込められ、外部からはアクセスできません。
console.log(MyApp.appName); // "TypeScript App"
MyApp.internalFunction(); // エラー: internalFunctionは存在しない
namespaceでスコープの汚染を防ぐ
namespace
を使うと、グローバル変数や関数を一元管理することができ、外部と名前が衝突するリスクを低減できます。namespace
内で定義されたメンバーは、そのnamespace
を通じてアクセスされるため、グローバルスコープでの名前の重複を避けることができます。
namespace MathUtils {
export function add(a: number, b: number): number {
return a + b;
}
}
console.log(MathUtils.add(10, 20)); // 30
このように、namespace
を使うことで、関連する関数や変数を整理しつつ、必要な部分だけを外部に公開できます。これにより、コードの可読性と保守性が向上します。
namespaceのネストと拡張
TypeScriptのnamespace
はネストすることができ、階層構造を持たせて複雑なシステムを整理することができます。また、別のファイルや後からnamespace
を拡張して機能を追加することも可能です。
namespace MyApp {
export namespace Utils {
export function log(message: string) {
console.log("Log: " + message);
}
}
}
MyApp.Utils.log("Hello from nested namespace"); // "Log: Hello from nested namespace"
namespaceとESモジュールの違い
namespace
は、内部でのスコープ管理には非常に便利ですが、ESモジュールを使用したモジュールシステムとは異なり、外部依存のモジュールをインポートするには向いていません。そのため、TypeScriptプロジェクトでは、一般的にモジュールシステム(import
/export
)の使用が推奨されていますが、グローバルスコープの簡易的な管理にはnamespace
が適しています。
このように、namespace
はTypeScriptでのスコープ管理において強力なツールであり、グローバルスコープを汚染せずにコードを整理できる手段の一つです。
モジュールバンドラーを利用したスコープの最適化
モジュールバンドラー(WebpackやRollupなど)は、複数のJavaScriptファイルやTypeScriptファイルを一つにまとめ、効率的なスコープ管理とコードの最適化を行うツールです。モジュールバンドラーを活用することで、グローバルスコープを意識せずにモジュールを管理でき、さらにコードのサイズやパフォーマンスを改善することが可能です。
Webpackの基本とスコープ管理
Webpackは、TypeScriptプロジェクトでよく使われるモジュールバンドラーの一つです。Webpackを使用することで、複数のTypeScriptファイルを一つのバンドルにまとめ、グローバルスコープを汚染することなくコードを分割管理できます。Webpackでは、各モジュールが個別のスコープを持つため、グローバルスコープの衝突を防ぐことができます。
npm install --save-dev webpack webpack-cli ts-loader
webpack.config.js
を設定して、TypeScriptファイルをビルドする設定例です。
const path = require('path');
module.exports = {
entry: './src/index.ts',
module: {
rules: [
{
test: /\.ts$/,
use: 'ts-loader',
exclude: /node_modules/,
},
],
},
resolve: {
extensions: ['.ts', '.js'],
},
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
};
この設定により、src/index.ts
をエントリーポイントとして、他のファイルを依存関係に応じて自動的にバンドルします。結果として生成されるbundle.js
は、グローバルスコープを汚染せずに一つのファイルにまとめられます。
Rollupによる軽量なスコープ管理
Rollupは、特にESモジュールのバンドルに優れているツールです。Webpackと同様に、複数のモジュールを一つのバンドルにまとめ、グローバルスコープの汚染を防ぎますが、Rollupはより軽量でシンプルな構成を好むプロジェクトに向いています。
npm install --save-dev rollup rollup-plugin-typescript2
Rollupの基本設定は以下のようになります。
import typescript from 'rollup-plugin-typescript2';
export default {
input: 'src/index.ts',
output: {
file: 'dist/bundle.js',
format: 'iife', // 即時実行形式の出力
name: 'MyApp', // グローバルに公開する名前
},
plugins: [typescript()],
};
Rollupは、シンプルかつ最適化されたバンドルを生成し、コードのサイズやパフォーマンスに優れています。また、TypeScriptの型チェックも容易に行えるため、堅牢なコードを保ちながら、スコープの管理を効率化できます。
ツリ―シェイキングで無駄なコードを排除
WebpackやRollupは「ツリーシェイキング」機能をサポートしており、使用されていないモジュールや関数をバンドルから除外することで、最終的なバンドルサイズを削減します。これにより、不要なグローバルスコープの汚染や、プロジェクト全体のパフォーマンスに悪影響を与える無駄なコードを排除できます。
// 使用していない関数はバンドルに含まれない
export function unusedFunction() {
console.log("この関数は使われません");
}
export function usedFunction() {
console.log("この関数は使われます");
}
モジュールバンドラーの選択と適用例
プロジェクトの規模や要件に応じて、WebpackやRollupを選択することが重要です。大規模なアプリケーションではWebpackが多機能で有利ですが、小規模で効率的なバンドルを求める場合にはRollupが適しています。どちらのツールも、グローバルスコープを汚染せずにスコープを適切に管理し、効率的なコードを提供するために役立ちます。
このように、モジュールバンドラーを利用することで、TypeScriptのプロジェクトをより効率的に、そしてグローバルスコープを汚染せずに管理できます。
グローバル変数の名前衝突の防止策
グローバルスコープでの変数の名前衝突は、特に大規模なプロジェクトや複数の外部ライブラリを使用する際に問題となります。TypeScriptでは、適切な設計パターンやツールを利用することで、これらの問題を回避することが可能です。ここでは、グローバル変数の名前衝突を防ぐための具体的な対策を紹介します。
名前空間(namespace)の活用
先ほど紹介したnamespace
を活用することで、変数や関数をグループ化し、名前衝突を防ぐことができます。namespace
を使用することで、各モジュールや機能が独自の名前空間を持ち、他の部分との干渉を避けられます。
namespace MyApp {
export const version = "1.0";
}
namespace OtherApp {
export const version = "2.0";
}
console.log(MyApp.version); // "1.0"
console.log(OtherApp.version); // "2.0"
このように、namespace
を使用すると、異なるモジュールやライブラリで同じ名前の変数を定義しても、それぞれのスコープ内で名前が衝突することはありません。
モジュール化によるスコープの分離
TypeScriptのimport
/export
によるモジュールシステムは、スコープの分離を自然に実現します。モジュール化を徹底することで、すべての変数や関数がローカルスコープに閉じ込められ、グローバルスコープでの名前衝突を防げます。
// moduleA.ts
export const appName = "App A";
// moduleB.ts
export const appName = "App B";
// 使用例
import { appName as appAName } from './moduleA';
import { appName as appBName } from './moduleB';
console.log(appAName); // "App A"
console.log(appBName); // "App B"
import
とexport
により、変数名を自由に変更でき、モジュール間で名前の競合が発生しないように管理できます。
即時実行関数式(IIFE)によるグローバル変数の隠蔽
IIFEを使うことで、変数や関数を一時的なスコープ内に閉じ込め、グローバルスコープに露出させないという方法もあります。これにより、グローバル変数の衝突を避けることができます。
(function() {
const tempVariable = "Temporary";
console.log(tempVariable); // "Temporary"
})();
console.log(tempVariable); // エラー: tempVariableは定義されていない
IIFEを用いると、グローバルスコープを汚染せずに一時的な変数を扱うことができ、名前衝突を防げます。
外部ライブラリ使用時の安全な変数管理
外部ライブラリを利用する際には、ライブラリによってグローバル変数が追加される場合があります。TypeScriptのdeclare
キーワードを使って、外部ライブラリが定義するグローバル変数やオブジェクトを安全に型定義することが可能です。
// グローバル変数に対する型定義
declare var externalLibrary: any;
// 型を指定して変数を使用
externalLibrary.doSomething();
このように、外部ライブラリのグローバル変数を明示的に型定義しておくことで、名前衝突や予期しない動作を防止できます。
ESLintによるコーディングルールの強制
ESLintなどのコードリントツールを導入して、グローバル変数の定義や使用を厳しく制限することも、名前衝突を防ぐための有効な手段です。特定のルールを設定することで、プロジェクト全体で一貫したスコープ管理を強制し、バグや名前衝突のリスクを大幅に軽減できます。
// .eslintrc.json
{
"rules": {
"no-global-assign": "error",
"no-undef": "error"
}
}
この設定により、グローバルスコープでの変数定義が制限され、意図しない名前衝突を防ぐことができます。
以上のような手法を活用することで、グローバル変数の名前衝突を回避し、コードの安定性と保守性を向上させることが可能です。
外部ライブラリとの連携時のグローバルスコープ管理
外部ライブラリを使用する際には、ライブラリがグローバルスコープを汚染する可能性があります。特に、古いJavaScriptライブラリや、モジュールシステムを採用していないライブラリを利用する場合、グローバルスコープに直接変数やオブジェクトが追加されることが多いため注意が必要です。TypeScriptでは、これらのライブラリとの安全な連携を図りつつ、グローバルスコープの汚染を防ぐための対策がいくつか存在します。
外部ライブラリの型定義
TypeScriptで外部ライブラリを使用する際は、@types
パッケージをインストールして型定義を追加するのが一般的です。これにより、ライブラリの使用時に型チェックが行われ、安全に連携できます。外部ライブラリが提供する型定義ファイルを使用することで、グローバルスコープの汚染を防ぐだけでなく、意図しないバグの発生も防げます。
npm install --save-dev @types/jquery
例えば、JQueryを使う場合、型定義をインストールすれば、グローバルな$
変数が正しく型付けされます。
$('#element').text('Hello World');
このように、型定義を適用することで、グローバル変数がどのライブラリに由来するかを明確にしつつ、グローバルスコープの汚染を最小限に抑えることができます。
UMDモジュールを利用したライブラリのインポート
多くの外部ライブラリは、UMD(Universal Module Definition)形式を採用しており、モジュールとしてもグローバル変数としても利用可能です。TypeScriptでは、このUMD形式のライブラリをモジュールとしてインポートし、グローバルスコープに依存せずに利用できます。
import * as _ from 'lodash';
const array = [1, 2, 3, 4];
console.log(_.shuffle(array)); // 配列の要素をランダムにシャッフル
このように、外部ライブラリをimport
することで、グローバルスコープに直接依存せず、ライブラリを安全に利用できます。ライブラリがグローバル変数を追加していたとしても、モジュールシステム内で安全に管理されます。
Webpackによる外部ライブラリのスコープ制御
Webpackなどのモジュールバンドラーを使用することで、外部ライブラリがグローバルスコープを汚染するリスクを低減できます。Webpackのexternals
オプションを使用すると、ライブラリがグローバル変数として存在する場合でも、モジュールとして安全に扱うことができます。
// webpack.config.js
module.exports = {
externals: {
jquery: 'jQuery'
}
};
この設定により、JQueryはグローバルスコープにjQuery
として存在しますが、Webpackのバンドルには含まれず、他のコードに干渉することなく使用できます。
即時実行関数式(IIFE)で外部ライブラリを隔離
IIFEを使って、外部ライブラリをローカルスコープに閉じ込めることも有効な手段です。これにより、ライブラリがグローバル変数を追加してしまう場合でも、影響を最小限に抑えられます。
(function() {
const $ = window.jQuery;
$('#element').text('Hello World');
})();
この例では、JQueryをローカルスコープに閉じ込めて、グローバル変数$
を意図的に限定された範囲でのみ使用しています。これにより、他のコードやライブラリとの衝突を防げます。
外部ライブラリとの安全な型宣言
外部ライブラリがグローバル変数を提供する場合、TypeScriptではdeclare
キーワードを使って安全にグローバル変数を宣言し、その利用範囲を明確に制御することができます。
declare const someGlobalLibrary: any;
someGlobalLibrary.doSomething();
このように宣言することで、グローバル変数が存在することを明示し、型チェックを行いながら安全に使用できます。これにより、コードの可読性と安全性が向上し、予期せぬグローバルスコープ汚染を避けることができます。
外部ライブラリとの連携時には、このような対策を講じることで、グローバルスコープを適切に管理し、名前衝突や予期しないバグのリスクを減らすことができます。
実際のプロジェクトでの事例紹介
TypeScriptを使用したプロジェクトでは、グローバルスコープを汚染せずに変数管理を行うことが特に重要です。ここでは、実際のプロジェクトでどのようにスコープを適切に管理し、グローバル変数の名前衝突やライブラリとの連携を最適化した事例を紹介します。
事例1: 大規模なフロントエンドアプリケーションでのモジュールシステム活用
ある企業が開発した大規模なフロントエンドアプリケーションでは、TypeScriptのモジュールシステムを積極的に活用しました。プロジェクトは複数の開発チームが同時に作業を行うもので、各チームが独立してモジュールを作成していました。グローバルスコープの汚染を防ぐため、すべてのコードをimport
/export
を利用してモジュール化し、変数や関数が他のチームのコードに影響を与えないようにしました。
例えば、各モジュールは明示的に名前を持たせ、モジュール間で変数名の衝突を避けています。
// チームAが作成したモジュール
export const featureA = () => {
console.log("Feature A");
};
// チームBが作成したモジュール
export const featureB = () => {
console.log("Feature B");
};
このように、チームごとの独立したモジュールを管理することで、グローバルスコープを全く汚染せず、各機能をモジュール単位でしっかりと分割し、メンテナンスのしやすいプロジェクト構造を維持しました。
事例2: 外部ライブラリとの連携を考慮したスコープ管理
別のプロジェクトでは、複数の外部ライブラリ(例えば、JQueryやLodashなど)を使用していましたが、それぞれがグローバル変数を追加するリスクがありました。このプロジェクトでは、外部ライブラリをWebpackを使って適切に管理し、グローバルスコープの汚染を防ぎました。
プロジェクトの設定では、externals
オプションを使って、外部ライブラリがグローバルスコープに影響を与えないように設定しました。
// webpack.config.js
module.exports = {
externals: {
lodash: '_',
jquery: 'jQuery'
}
};
さらに、TypeScriptの@types
パッケージをインストールして、JQueryやLodashを型安全に扱うことができるようにしました。これにより、外部ライブラリを利用しつつも、プロジェクト全体の変数管理がしっかりと行われ、グローバルスコープに余計な変数が追加されることを防ぎました。
事例3: IIFEでの一時的なスコープ分離による安全な実装
ある中小規模のウェブアプリケーションでは、古いJavaScriptコードとTypeScriptコードが共存していました。このプロジェクトでは、IIFEを使って特定の処理をスコープに閉じ込め、古いコードとの干渉を避けました。
(function() {
const tempData = "Temporary Data";
function processData() {
console.log("Processing: " + tempData);
}
processData();
})();
この手法により、TypeScriptで書かれた新しいコードが古いJavaScriptコードと変数を共有せず、グローバルスコープを汚染せずに動作するように工夫しました。このプロジェクトでは、段階的に古いコードを置き換える過程でIIFEを活用し、スムーズに移行することができました。
事例4: モジュールバンドラーによるツリーシェイキングの活用
別のプロジェクトでは、Rollupを使用してモジュールバンドルを行い、ツリーシェイキング機能を活用しました。使用されていないモジュールや関数を自動的に除外し、バンドルサイズを削減するだけでなく、不要なグローバル変数の追加を防ぎました。これにより、パフォーマンスが向上するとともに、よりセキュアで効率的なスコープ管理が実現されました。
// 使用されていない関数はバンドルに含まれない
export function unusedFunction() {
console.log("This function is not used");
}
export function usedFunction() {
console.log("This function is used");
}
このプロジェクトでは、最終的なバンドルサイズが大幅に削減され、グローバルスコープの汚染を最小限に抑えたスムーズな運用が可能になりました。
事例5: TypeScriptによる安全なグローバル変数の型管理
あるプロジェクトでは、グローバル変数がどうしても必要な状況がありましたが、TypeScriptのdeclare
を活用して、安全にグローバル変数を型定義しました。これにより、グローバルスコープの変数の使用が明示的になり、開発者間での混乱を避けることができました。
declare var globalConfig: {
apiUrl: string;
timeout: number;
};
console.log(globalConfig.apiUrl); // 型安全にアクセス
このように、declare
を使用してグローバル変数の型を定義し、プロジェクト全体で安全に管理しました。
これらの事例から、TypeScriptを使用する際にスコープ管理を適切に行うことが、プロジェクトの健全性と保守性を向上させるためにいかに重要かが理解できます。
応用編:演習問題
TypeScriptでグローバルスコープを汚染しないためのスコープ管理について理解を深めるために、以下の演習問題を解いてみましょう。これらの問題を通して、スコープの管理や外部ライブラリとの連携に関する知識を実践的に確認できます。
問題1: モジュール化による変数管理
次のTypeScriptコードは、複数の変数がグローバルスコープで定義されています。これらを適切にモジュール化して、グローバルスコープを汚染しないように変更してください。
const name = "John";
const age = 30;
function greet() {
console.log(`Hello, ${name}. You are ${age} years old.`);
}
ヒント
export
を使ってモジュール化し、変数をグローバルスコープに直接定義しないようにします。別のファイルでimport
して使用できるようにしてみましょう。
問題2: 即時実行関数式(IIFE)の活用
次のコードはグローバル変数data
を使用しています。このdata
をグローバルスコープに公開しないように、IIFEを使ってスコープを分離してください。
let data = "Sensitive Data";
function processData() {
console.log(`Processing: ${data}`);
}
processData();
ヒント
IIFEを使って、data
とprocessData
をローカルスコープ内に閉じ込め、外部からアクセスできないようにします。
問題3: 外部ライブラリとの連携
JQueryを使用して、要素のテキストを変更する次のコードがあります。このコードをモジュール化し、JQueryをグローバルスコープに露出させないように書き換えてください。
$('#myElement').text('New Text');
ヒント
JQueryの@types
パッケージを利用し、グローバルスコープに依存せずにimport
を使用して管理しましょう。
問題4: 名前空間(namespace)の活用
次のコードは、複数の機能が同じ名前の変数を使用しているため、名前衝突が発生しています。namespace
を使って名前衝突を防ぎ、コードを整理してください。
const data = "Data from module A";
const data = "Data from module B";
function logData() {
console.log(data);
}
ヒント
namespace
を使って、それぞれのdata
変数を別々のスコープに閉じ込めます。
これらの演習問題に取り組むことで、TypeScriptでのスコープ管理の理解を深め、グローバルスコープの汚染を防ぐ技術を実践的に学ぶことができます。
まとめ
本記事では、TypeScriptでグローバルスコープを汚染しないための変数管理方法について詳しく解説しました。モジュールシステムやnamespace
、即時実行関数式(IIFE)を活用することで、変数や関数を安全にスコープ内に閉じ込め、名前衝突やバグを回避できます。また、外部ライブラリとの連携においても、適切な型定義やモジュールバンドラーの使用によって、グローバルスコープの汚染を防ぐことが可能です。これらの手法を活用し、健全で保守性の高いコードを維持しましょう。
コメント