JavaScriptで関数内の変数を別の関数から参照する方法を徹底解説
JavaScriptでは、関数内で宣言された変数はその関数のローカルスコープに属するため、外部から直接アクセスすることはできません。しかし、コンストラクタ関数やクロージャといった仕組みを活用すれば、別の関数やグローバル領域からこれらの変数へアクセスできるようになります。
本記事では、「2つの数値を加算する」というシンプルなタスクを実行する関数を例に、関数内で宣言された変数を外部から取得する具体的な方法を解説します。
実装例:this を使ったコンストラクタ関数
以下のコードでは、コンストラクタ関数内で this を使い、ランダム値と計算結果をインスタンス自身のプロパティとして割り当てています。これにより、関数の外側からも値を参照できるようになります。
const num = 5;
const addRandomToNumber = function(num){
// [0, 10) の範囲からランダムな整数を生成
const random = Math.floor(Math.random() * 10);
// 外部からアクセスできるよう、
// インスタンス自身にプロパティとして代入
this.random = random;
this.res = num + random;
};
// new 演算子でインスタンスを生成
const addRandomInstance = new addRandomToNumber(num);
const scopedRandom = addRandomInstance.random;
const result = addRandomInstance.res;
// result - scopedRandom は元の num の値(5)と一致するはず
console.log(result - scopedRandom);
出力結果
コンソールには次のように表示されます。
5
コードのポイント
- 関数内で宣言した
random変数は、そのままでは関数の外部から参照できません。 this.random = random;と記述することで、生成されたインスタンスのプロパティとして値が保持され、addRandomInstance.randomの形で外部からアクセス可能になります。newキーワード付きで呼び出すことで、thisが新しく生成されるオブジェクトを指すため、この手法が正しく機能します。- 最後の
console.log(result - scopedRandom)が 5 を出力することで、計算結果からランダム値を差し引いた際に元の値が復元されていることが確認できます。
補足:その他のアプローチ
this を使う方法以外にも、関数内の変数を外部に公開する手段はいくつかあります。
- 戻り値として返す:
return文でオブジェクトや配列にまとめて値を返せば、呼び出し側が必要な変数をすべて受け取れます。最もシンプルで推奨される方法です。 - クロージャを活用する: 内部関数を返す構造にすることで、外側の関数スコープにある変数を状態として保持し続けられます。カプセル化したい場面で有効です。
用途に応じてこれらの手法を使い分けることで、安全かつ柔軟にデータを扱えるようになります。
-
JavaScriptである関数から別の関数へイベントオブジェクトを渡す方法
JavaScriptでは、イベントハンドラ内で取得したイベントオブジェクトを、そのまま引数として別の関数へ渡すことができます。イベントオブジェクトには発生元の要素(event.target)やイベントの種類などの情報が含まれているため、複数の関数で同じイベント情報を共有したい場合にとても便利です。以下は、クリックイベントのイベントオブジェクトを受け渡し、ボタンのフォントサイズと文字色を変更するサンプルコードです。サンプルコード<!DOCTYPE html> <html lang="en"> <head> <meta charset=
-
JavaScriptで別のオブジェクトを介してオブジェクトにアクセスする方法
JavaScriptでは、あるオブジェクトを定義する際に、別のオブジェクトのプロパティやメソッドを参照することで、その値を取得したり、メソッドの実行結果を利用したりすることができます。この記事では、既存のオブジェクト(obj)を介して、新しいオブジェクト(obj2)からプロパティやメソッドにアクセスする方法を、具体的なコード例とともに解説します。押さえておきたいポイントオブジェクトリテラルの中で obj.lastName のように記述すると、その時点での値が新しいオブジェクトにコピーされます。obj.welcome() のようにメソッド名の後に括弧を付けると、オブジェクト定義時にメソッドが即座