JavaScriptのthisについて基本中の基本

JavaScriptより先にPythonを学んだ自分にとって、thisはよくわからない存在だった。いや、使い方はわかるんだけど、なんていうかしっくりこない。

それから以下のようなコードがエラーになる理由もよくわからない。

var w = document.write;
w('hello world');  // TypeError

「コーディングを支える技術」という本を読んでいたら、こういう説明があった(P.200)。

thisは予約語で、ある関数my_methodがあるオブジェクトobjと組み合わされてobj.my_method()という形で呼ばれた場合に、my_method本体の中でobjを参照するのに使います。

あー、なるほど。ようするにこういうことか↓

function set_value(value) {
    this.value = value;
}

var obj1 = {func : set_value};
obj1.func('bar');
console.log(obj1.value);

var obj2 = {func : set_value};
obj2.func('baz');
console.log(obj2.value);

set_value('foo');
console.log(window.value);

この説明が一番しっくりきたわ。最初にこれが聞きたかった。「javascript this」でググって出てくる文章は、ルールの細則にすぎない。

なんで、こういう説明がないのか3秒ほど考えてみたけど、たぶん日本にはPythonJavaScriptという順番で覚える人が少ないんだろうなという結論に達した。