JavaScriptのthisキーワード解説

2024-09-19

JavaScriptのthisキーワードについて

thisキーワードは、JavaScriptにおけるオブジェクトのコンテキスト(実行環境)を指す特別なキーワードです。その値は、関数が呼び出された方法によって異なります。

thisの値が決定される方法

  • アロー関数
    アロー関数は、thisを定義するスコープのthisを参照します。つまり、アロー関数の外側のthisの値を継承します。
  • call()またはapply()メソッドを使って呼び出されたとき
    thisの値は、これらのメソッドの最初の引数として指定されたオブジェクトになります。
  • new演算子を使って呼び出されたとき
    thisは、新しく作成されたオブジェクトを参照します。
  • 関数として呼び出されたとき
    • 厳格モード
      thisは、グローバルオブジェクト(windowオブジェクト)を参照します。
    • 非厳格モード
      thisは、呼び出し元のオブジェクトを参照します。ただし、呼び出し元が明示的に指定されていない場合、thisはグローバルオブジェクトを参照します。
  • オブジェクトメソッドとして呼び出されたとき
    thisは、そのメソッドが定義されているオブジェクトを参照します。

thisの使用例

// オブジェクトメソッドとして呼び出されたとき
const person = {
  name: "Alice",
  greet: function() {
    console.log("Hello, my name is " + this.name);
  }
};

person.greet(); // Output: Hello, my name is Alice   

// 関数として呼び出されたとき(非厳格モード)
function sayHello() {
  console.log("Hello, my name is " + this.name);
}

sayHello(); // Output: Hello, my name is Alice (assuming the global object has a "name" property)

// `new`演算子を使って呼び出されたとき
function Person(name) {
  this.name = name;
}

const person2 = new Person("Bob");
console.log(person2.name); // Output: Bob

// `call()`メソッドを使って呼び出されたとき
const person3 = { name: "Charlie" };
sayHello.call(person3); // Output: Hello, my name is Charlie

// アロー関数
const greet = () => {
  console.log("Hello, my name is " + this.name);
};

greet.call(person); // Output: Hello, my name is Alice (アロー関数は外側の`this`を参照)



オブジェクトメソッドとして呼び出されたとき

const person = {
  name: "Alice",
  greet: function() {
    console.log("Hello, my name is " + this.name);
  }
};

person.greet(); // Output: Hello, my name is Alice   
  • greetメソッドがpersonオブジェクトのメソッドとして呼び出されているため、thispersonオブジェクトを参照します。

関数として呼び出されたとき(非厳格モード)

function sayHello() {
  console.log("Hello, my name is " + this.name);
}

sayHello(); // Output: Hello, my name is Alice (assuming the global object has a "name" property)
  • sayHello関数が関数として呼び出されているため、非厳格モードではthisはグローバルオブジェクト(windowオブジェクト)を参照します。

new演算子を使って呼び出されたとき

function Person(name) {
  this.name = name;
}

const person2 = new Person("Bob");
console.log(person2.name); // Output: Bob
  • Person関数がnew演算子を使って呼び出されているため、thisは新しく作成されたperson2オブジェクトを参照します。

call()またはapply()メソッドを使って呼び出されたとき

const person3 = { name: "Charlie" };
sayHello.call(person3); // Output: Hello, my name is Charlie
  • call()メソッドの最初の引数としてperson3オブジェクトが渡されているため、thisperson3オブジェクトを参照します。

アロー関数

const greet = () => {
  console.log("Hello, my name is " + this.name);
};

greet.call(person); // Output: Hello, my name is Alice (アロー関数は外側の`this`を参照)
  • アロー関数は、thisを定義するスコープのthisを参照します。この例では、greet関数は外側のthispersonオブジェクト)を参照します。

オブジェクトのプロパティへのアクセス

const car = {
  color: "red",
  start: function() {
    console.log("Starting the " + this.color + " car.");
  }
};

car.start(); // Output: Starting the red car.
  • this.colorは、carオブジェクトのcolorプロパティを参照します。

オブジェクトメソッドの呼び出し

const person = {
  name: "Alice",
  greet: function() {
    console.log("Hello, my name is " + this.name);
  },
  sayHello: function() {
    this.greet();
  }
};

person.sayHello(); // Output: Hello, my name is Alice
  • this.greet()は、personオブジェクトのgreetメソッドを呼び出します。

イベントハンドラーでの使用

const button = document.getElementById("myButton");
button.addEventListener("click", function() {
  console.log("Button click   ed!");
});
  • イベントハンドラーの関数内では、thisはイベントの発生元である要素(button)を参照します。



bind()メソッド

  • 新しい関数を呼び出すと、thisは常に指定したオブジェクトを参照します。
  • 戻り値は、新しい関数です。
  • bind()メソッドは、関数のthis値を固定します。
const person = { name: "Alice" };

function greet() {
  console.log("Hello, my name is " + this.name);
}

const boundGreet = greet.bind(person);
boundGreet(); // Output: Hello, my name is Alice   
  • これは、関数を作成する場所のthisの値を継承します。
  • アロー関数は、thisを定義するスコープのthisを参照します。
const person = { name: "Alice" };

const greet = () => {
  console.log("Hello, my name is " + this.name);
};

greet.call(person); // Output: Hello, my name is Alice

クロージャ

  • クロージャ内の関数から外側のスコープの変数にアクセスできます。
  • クロージャは、関数とその定義時のスコープを束縛したものです。
function createGreeter(name) {
  return function() {
    console.log("Hello, my name is " + name);
  };
}

const greetAlice = createGreeter("Alice");
greetAlice(); // Output: Hello, my name is Alice

call()またはapply()メソッド

  • これらのメソッドは、関数のthis値を一時的に変更することができます。
const person = { name: "Alice" };

function greet(age) {
  console.log("Hello, my name is " + this.name + ". I am " + age + " years old.");
}

greet.call(person, 30); // Output: Hello, my name is Alice. I am 30 years old.

arguments.callee

  • しかし、ES5以降では非推奨になっています。
  • arguments.calleeは、現在の関数を指します。

選択基準

  • 関数のthis値を一時的に変更する必要がある場合
    call()またはapply()メソッドを使用します。
  • 外側のスコープの変数にアクセスする必要がある場合
    クロージャを使用します。
  • thisを固定する必要がある場合
    bind()メソッドまたはアロー関数を使用します。

javascript this



テキストエリア自動サイズ調整 (Prototype.js)

Prototype. js を使用してテキストエリアのサイズを自動調整する方法について説明します。Prototype. js を読み込みます。window. onload イベントを使用して、ページの読み込み後にスクリプトを実行します。$('myTextarea') でテキストエリアの要素を取得します。...


JavaScript数値検証 IsNumeric() 解説

JavaScriptでは、入力された値が数値であるかどうかを検証する際に、isNaN()関数やNumber. isInteger()関数などを利用することが一般的です。しかし、これらの関数では小数点を含む数値を適切に検出できない場合があります。そこで、小数点を含む数値も正しく検証するために、IsNumeric()関数を実装することが有効です。...


jQueryによるHTMLエスケープ解説

JavaScriptやjQueryでHTMLページに動的にコンテンツを追加する際、HTMLの特殊文字(<, >, &, など)をそのまま使用すると、意図しないHTML要素が生成される可能性があります。これを防ぐために、HTML文字列をエスケープする必要があります。...


JavaScriptフレームワーク:React vs Vue.js

JavaScriptは、Webページに動的な機能を追加するために使用されるプログラミング言語です。一方、jQueryはJavaScriptライブラリであり、JavaScriptでよく行う操作を簡略化するためのツールを提供します。jQueryを学ぶ場所...


JavaScriptオブジェクトプロパティの未定義検出方法

JavaScriptでは、オブジェクトのプロパティが定義されていない場合、そのプロパティへのアクセスはundefinedを返します。この現象を検出して適切な処理を行うことが重要です。最も単純な方法は、プロパティの値を直接undefinedと比較することです。...



SQL SQL SQL SQL Amazon で見る



JavaScript、HTML、CSSでWebフォントを検出する方法

CSS font-family プロパティを使用するCSS font-family プロパティは、要素に適用されるフォントファミリーを指定するために使用されます。このプロパティを使用して、Webページで使用されているフォントのリストを取得できます。


ポップアップブロック検知とJavaScript

ポップアップブロックを検知する目的ポップアップブロックはユーザーのプライバシーやセキュリティを保護するためにブラウザに組み込まれている機能です。そのため、ポップアップブロックが有効になっている場合、ポップアップを表示することができません。この状況を検知し、適切な対策を講じるために、JavaScriptを使用することができます。


HTML要素の背景色をJavaScriptでCSSプロパティを使用して設定する方法

JavaScriptを使用すると、CSSプロパティを動的に変更して、HTML要素の背景色を制御できます。この方法により、ユーザーの入力やページの状況に応じて、背景色をカスタマイズすることができます。HTML要素の参照を取得HTML要素の参照を取得


JavaScript オブジェクトの長さについて

JavaScriptにおけるオブジェクトは、プロパティとメソッドを持つデータ構造です。プロパティはデータの値を保持し、メソッドはオブジェクトに対して実行できる関数です。JavaScriptの標準的なオブジェクトには、一般的に「長さ」という概念はありません。これは、配列のようなインデックスベースのデータ構造ではないためです。


JavaScriptグラフ可視化ライブラリ解説

JavaScriptは、ウェブブラウザ上で動作するプログラミング言語です。その中で、グラフの可視化を行うためのライブラリが数多く存在します。これらのライブラリは、データ構造やアルゴリズムを視覚的に表現することで、理解を深める助けとなります。