JavaScriptのthisのメモ。
JavaScriptの関数が参照するthisの値はイベントハンドラ(イベントリスナー)とそれ以外の場合で分けて考える。
この記事ではJavaScriptの関数を便宜上3つに分ける[1]。
JavaScriptは関数を呼び出すとき自動的にthisをグローバルオブジェクトに初期化する。実行環境がブラウザならグローバルオブジェクトはwindowオブジェクトになる。
// 関数呼び出しの例
// 関数
function f() {
console.log(this); // window : global object
}
f();
// 関数(即時実行)
(function() {
console.log(this); // window : global object
}());
// クロージャー
function hasClosure() {
return function() {
console.log(this); // window : global object
};
}
var closure = hasClosure();
closure();
メソッドのthisはそのメソッドを持つオブジェクトを指す。
// 例1 メソッド
var o = {
m: function() {
console.log(this); // Object { m=function()}
}
}
o.m();
// 例2 メソッド
var object = (function() {
function _m() {
console.log(this); // Object{ m=_m() }
};
return {
m: _m
};
}());
object.m();
» jsFiddle
コンストラクタのthisは生成されるインスタンスを指す。
function CustomObject () {
this.m = function() {
console.log(this);
}
}
var ins = new CustomObject();
ins.m(); // CustomObject { m=function()}
イベントハンドラ(イベントリスナー)のthisはハンドラ/リスナーを設定した要素になる(event.currentTarget)。
<p id="foo">Foo</p> <p id="bar">Bar</p>
var Foo = function() {
this.id = 'Foo';
this.func = function() {
console.log(this.id); // Fooではなくfoo
};
document.getElementById('foo').addEventListener('click', this.func, false);
};
new Foo();
// インスタンスをthisにしたいとき
var Bar = function() {
this.id = 'Bar';
this.func = function() {
console.log(this.id); // barではなくBar
}
document.getElementById('bar').addEventListener('click', this.func.bind(this), false);
}
new Bar();
[1] Douglas 2008は関数呼び出しを4つに分類するが、本記事ではそのうちの3つに絞っている。
Douglas Crockford著, 水野 貴明訳 2008 『JavaScript:The Cood Parts』 オライリージャパン。
[2] メソッドはオブジェクトのプロパティ。
[3] new演算子でインスタンスを作成することを想定して作成するfunction文。[1]の意味の関数と区別する意味で名前を大文字で始めることが多い。
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。