オブジェクトのメソッドからそのオブジェクトのメソッドを呼び出したい時に、コールバック関数を使う時などのthisが使えない場合について。
以下のような、thisを退避する書き方しか思いつかなかったのですが、もっとスマートな書き方はありますか?
a = new f1();
function f1(1){
var self = this;
this.sum = function(i){return i+1};
this.op = function(i){
return f2(i,function(j){
return self.sum(j); //this.sumだとエラーになってしまう。
})
}
}
function f2(i,func){
return func(i)
}
alert(a.op(1));
結論からいうと、JavaScriptはそういう仕様になっているのでできないと思います。
ただし、その部分を外部に切り分けると見た目は少しだけスマートになるかもしれません。
例えば、有名なライブラリであるprototype.jsにはbindというメソッドがあります。
その実体はapplyメソッドのラッパーです。
http://d.hatena.ne.jp/higepon/20050901/1125555797
質問の例だと入れ子レベルが深いので、素直に待避するのがスマートな気はしますが…
なるほど。applyって、そうやって使うんですね。
何に使うんだろう、とか思ってました。
有難うございます。
確かにこの例だと、ネストの外側で処理しないといけなさそうで、かえって(私が)混乱しそうです。コールバック関数内で使うのにも向いていないのかな? イベントにメソッドを指定するのには良さそうですね。