日記
JavaScriptでpreg_replace_callback 2 (11:14)Edit

JavaScriptでpreg_replace_callback』の続き。replaceの第2引数で関数が呼べることがわかったんで、それならオブジェクトのメソッドも呼べるだろうと、以下のように書いてみた。

function Test()
{
this.prop = 1;
}
function Test_replace()
{
var str = 'abcde';
var result = str.replace(/bcd/, this.callback);
return result;
}
Test.prototype.replace = Test_replace;
function Test_callback()
{
return this.prop;
}
Test.prototype.callback = Test_callback;
test = new Test();
alert(test.replace());

確かにthis.callbackという表現でcallbackが呼べる。けど、実際にはthis.callbackが呼ばれているのではなく、単にTest_callbackが呼ばれているっぽい。

this.callback内で参照しているthisが、呼び出し元のthisじゃなく、windowオブジェクトになっちゃっている(Test_callbackの中身を「return this.location.href;」とかするとそのように動く)。だからthis.propで1に置換されることを期待しても、callback内ではthis.propが見つからず(未定義)、上記の結果はIEなら「ae」、Firefoxなら「aundefinede」になっちゃう。

うーん、replaceのコールバック関数として、オブジェクトのメソッドを呼ぶ方法はないのかなー。WikiParserを移植するに当たっては、オブジェクトのプロパティ(パーサーオブジェクトごとに固有の設定値)を参照したいんだけどなー。グローバル変数領域をそれなりに汚染しつつパラメータを受け渡すしかないのかなー。

ところでJavaScriptでの文字コード変換って、『Escape Codec Library: ecl.js』のライブラリを使わせてもらうってのが、現時点では一番妥当な選択なのかなー。 

Published At2005-04-03 00:00Updated At2005-04-03 00:00