| 著作一覧 |
妙だな、と、絶妙だな、では相当違う。多分、絶妙だな、が正しい。でもなんちゃらは絶えて久しいと云うが如し。
状況は、StrutsのTilesを使っていて複数のペインがある。で、bodyタグを持っているペインは既定。その中でonload="init();"とか呼んでいて、かつinit()は共通処理がコードされている。
問題は、initファンクションに手を入れずに、各ペインがロード時処理をどうやれば記述できるか?
で、こんなのを作った。
<html> <head>
<script>
function init() {
alert("pane1");
}
</script>
</head>
<body onload="init();">
<h1>original pane</h1>
<!-- end of pane -->
<h1>2nd pane</h1>
<script>
function pane2_init() {
pane2_init.init();
alert("pane2");
}
pane2_init.init = init;
init = pane2_init;
</script>
<!-- end of pane -->
<h1>3rd pane</h1>
<script>
function pane3_init() {
pane3_init.init();
alert("pane3");
}
pane3_init.init = init;
init = pane3_init;
</script>
<!-- end of pane -->
</body> </html>
ここでたとえばpane3_initファンクションの中でpane3_init.init();とメソッド呼び出しをしているが、最初、this.init();と書いたらぴくりとも動かないので、ちょっと悩んだ。
結局、ちゃんと調べなかったのだが、関数の中のthisはグローバルなオブジェクト(ここではwindow。alert(this);したらwindow objectと表示されるから多分、正しい認識)で、各関数はそれぞれ関数オブジェクトのインスタンスで、オブジェクトID=関数名という関連になってるんだと納得したのだが、それって正しい認識なのかな?
ジェズイットを見習え |
はい、正しいと思います。<br>Javascript(1.2)では件のpane3_initファンクションは以下の記述と同様だったかと。<br>var pane3_init = new Function() {〜} //コンストラクタ<br>var pane3_init = function() {〜} //関数リテラル <br>javascriptの場合関数は「Function型」として扱われますのでこの場合pane3_initはfunction文によって暗黙?で宣言されているFunction型の変数という扱いではないかと。<br>※恥ずかしながら最近学習した事柄なんで間違っていたら更なる突っ込みをお願いいたします。
関数のコンストラクタってのはおもしろいですね。
>関数のコンストラクタってのはおもしろいですね。<br>Lispとかのラムダ関数と同じようなものだそうです。といっても私はLispはわからないので関数へのポインタやデリゲートと何が違うのかまだよく解ってないです。