JavaScriptのスコープとコンテキストの違いとは?基礎からわかりやすく解説
JavaScriptにおいて、「スコープ」と「コンテキスト」はよく混同されますが、まったく別の概念です。関数を呼び出すときには、必ずこの両方が関わってきます。本記事では、それぞれの違いと仕組みをサンプルコード付きでわかりやすく解説します。
スコープ(Scope)とは
変数の「スコープ」とは、その変数が定義され、参照できる範囲のことを指します。JavaScriptの変数には、大きく分けて次の2種類のスコープがあります。
- グローバル変数:グローバルスコープを持ちます。つまり、JavaScriptコードのどこからでも定義・アクセスが可能です。
- ローカル変数:定義された関数の中でのみ参照できます。関数の外からはアクセスできません。
なお、関数に渡される引数(パラメータ)も、常にその関数内でのみ有効なローカル変数として扱われます。
また、ES6(ECMAScript 2015)以降では、let や const を使うことで、if文やfor文などの波括弧 {} の中だけで有効な「ブロックスコープ」を実現できるようになりました。
コンテキスト(Context)とは
「コンテキスト」は、関数がどのように呼び出されたかによって決まるものであり、主に this が何を指すのかに関わります。実際に例を見てみましょう。
サンプルコード
var ob1 = {
display: function() {
return this;
}
};
ob1.display() === ob1; // true
この例では、オブジェクトのメソッドとして関数を呼び出しているため、結果は true になります。これは、this のコンテキストが「メソッドを呼び出したオブジェクト(ここでは ob1)」に設定されるためです。
つまり、同じ関数でも呼び出し方によって this が指す対象は変わります。スコープが「変数の有効範囲」を表すのに対し、コンテキストは「呼び出し方」に依存するという点が、両者の大きな違いです。
-
JavaScriptの関数プロトタイプとは?仕組みと使い方を解説
JavaScriptで作成されたすべての関数には、JavaScriptエンジンによって自動的にprototypeプロパティが追加されます。このprototypeプロパティはオブジェクトであり、デフォルトではconstructorプロパティを含んでいます。関数のプロトタイプには、以下のようにしてアクセスできます。functionName.prototypeコンストラクタ関数を使ってオブジェクトを生成する場合、このprototypeプロパティを活用することで、同じコンストラクタから作成された複数のオブジェクト間でメソッドやプロパティを効率的に共有することができます。これにより、各インスタンスごとに
-
JavaScriptでのメソッド借用:call()・apply()・bind()の使い方を解説
JavaScriptでは、call()、apply()、bind()という3つのメソッドを使うことで、あるオブジェクトが持つメソッドを別のオブジェクトが「借用」できます。これは、本来そのメソッドを持たないオブジェクトに対して、thisの参照先を差し替えてメソッドを実行できる便利なテクニックです。 3つのメソッドの違い call():引数をカンマ区切りで個別に渡し、即座に関数を実行します。 apply():引数を配列(または配列風オブジェクト)として渡し、即座に関数を実行します。 bind():thisを固定した新しい関数を返すだけで、即座には実行されません。返された関数は後から好きなタイミン