読者です 読者をやめる 読者になる 読者になる

thisをdisる話

javaやC++などのオブジェクト指向言語では、thisがインスタンス自身を示していて、そこに全てがぶら下がっています。 クラス関数は、thisを介してクラス内のデータや他の関数にアクセスする形になり、もうthisはクラスの大黒柱、頼れるお父さんとして存在しています。 が、変態言語のJavaScriptでは、thisはそんな存在ではありません。

例えば・・・ (以下、node.jsで動作するサンプルプログラムです。)

function Samp1() {
    this.samp1 = 1;
}

function Samp2() {
    this.samp2 = 1;
}

Samp1.prototype.func = function() {
    for ( var i in this ) {
        console.log(i); // thisのメンバを出力
    }
}

という、 func``samp1というメンバを持つSamp1と、samp2というメンバを持つSamp2を作成してみます。 funcは、thisのメンバを標準出力に出力する機能を持ちます。

この後に

var samp1 = new Samp1();
samp1.func();

としてfunc1を実行してみると、

samp1
func

という内容が出力されます。thissamp1です。

次に・・・

var samp1 = new Samp1();
var f1 = samp1.func;
f1();

を実行してみます。

ArrayBuffer
Int8Array
Uint8Array
Uint8ClampedArray
・
・
・

という結果になります。thisglobal(?)です。

次に・・・

var samp1 = new Samp1();
var f1 = samp1.func;
var samp2 = new Samp2();
samp2.func = f1;
samp2.func();

を実行してみます。

samp2
func

となります。thissamp2です。

更には・・・

var samp1 = new Samp1();
var samp2 = new Samp2();
var f2 = samp1.func.bind(samp2);
f2();

を実行してみます。

samp2
func

という内容が出力されます。thissamp2です。

javaやC++では、頼れるお父さん的な存在だったthisが、javascriptでは入れ替わり立ち代わり入ってくる謎の人達を、お父さんと呼ばなくては行けない状態になるのです。 お、お母さん!?(これが書きたかった。。。)

functionの内側からは、外側からどう呼ばれるかが分からないので、thisに何が入っているか分からない。 逆に外側からは偽装し放題。 そこがいいとこでもあるのですが、バグ量産の元にもなるわ、バグの原因を追っかけづらいわ・・・

ワタシは、C++→Java→JavaScriptときたので、上の例で言うと、funcから常にSamp1を見ることができる、なんかしらの変数が欲しい。(JavaScriptの構造からいって、この考えは破綻しているのですが・・・でも欲しい。) いるのは、今のお父さん、thisだけなのです。

© 2009-2017 Osajiru All Rights Reserved.