😽
JavaScriptのthisとは何なのか
一言で言うと
呼び出し元のオブジェクトを参照できるキーワードである
もう少し詳しく
こんな関数があったとします。
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つは第二引数の取り方で違いがありますが、本旨と外れるため説明は割愛します。
Discussion