😽

JavaScriptのthisとは何なのか

2023/01/18に公開

一言で言うと

呼び出し元のオブジェクトを参照できるキーワードである

もう少し詳しく

こんな関数があったとします。

function showName() {
    console.log(this.name)
}

この関数を2つのオブジェクトで参照します。

const obj1 = {
    name: 'obj1',
    showName: showName
}

const obj2 = {
    name: 'obj2',
    showName: showName
}

function showName() {
    console.log(this.name)
}

関数を実行すると、オブジェクトそれぞれのnameが出力されます。

obj1.showName() // obj1
obj2.showName() // obj2

本来、showName関数自体にには呼び出し元の情報はありませんが、thisには呼び出し元オブジェクト(hoge.showName()hoge)を保持しているため各オブジェクトのnameプロパティを出力できるわけです。

呼び出し元オブジェクトがない場合は、グローバルコンテキストを参照する

上記のshowName関数をオブジェクトから呼び出さず直接実行した場合はundefinedとなります。
これは、グローバルコンテキスト、ブラウザならwindowオブジェクトを参照するためです。
window.nameというプロパティはデフォルトで存在しないためundefinedとなります。

なので、window.nameを設定すればその値が出力されます。

window.name = 'window object'

function showName() {
    console.log(this.name)
}

showName() // window object

参照オブジェクトを指定するapply, call

apply, callを使用するとthisが参照するオブジェクトを任意指定できます。
下記のobj1.showName.apply(obj2) の実行結果は、obj1ではなくobj2となります。
apply()の引数にobj2を渡しているため、thisの参照先がobj2になったわけです。

const obj1 = {
    name: 'obj1',
    showName: showName
}

const obj2 = {
    name: 'obj2',
    showName: showName
}

function showName() {
    console.log(this.name)
}

obj1.showName.apply(obj2) // obj2

上記のapplyをcallに変えても同じ結果となります。
2つは第二引数の取り方で違いがありますが、本旨と外れるため説明は割愛します。

insight

Discussion