2007/11/10 土曜日

太郎でも次郎でもない

カテゴリー: おぼえ書き — ryu @ 17:57:50

そっちかー。

Javascriptの「this」は日本語の「僕」みたいなものだ、と言ってみるテスト

ianimeの興味より this ポインタの方が気になられてるらしい。
Javaやってたら結構有る話で傍観モードだったけどコメントしてみるテスト(w。

Javascriptだと直感的でない事の本質は下記2点だと。
1.function()によってコンテキストが変わっている事に気がつきにくい
2.無名ブロックのコンテキストはGlobalオブジェクトに成るのは仕様

比較のためにJavaで書いてみる。


public class Test {
  public void hello(){
    final Test test = this;
    Thread th = new Thread(){
        public void run(){
          System.out.println( this.toString() );
          System.out.println( test.toString() );
          System.out.println( Test.this.toString() );
        }
      };
    th.start();
  }
  public static void main( String argv[] ){
    Test test = new Test();
    System.out.println( test.toString() );
    System.out.println( "-- " );
    test.hello();
  }
}
Test@41d683
--
Thread[Thread-0,5,main]
Test@41d683
Test@41d683

thisが別クラス内であれば別のオブジェクトに成るのは自然な流れ。
なので、1.の解説終わり。

Javaだとself使うにしてもfinalを要求される。
評価時にselfの内容が変わっている可能性を避けるためだけど、
こういう保護機能がない所がさすがjavascriptだ。

で、Javaだと Test.this という書き方も出来る。
これはまさに「太郎が僕に」という表現だろう。
個人的にはこの書き方が好き。
一つ前のでも動くけど、finalとはいえローカルスコープの変数を、
クロージャーでアクセスするのが気色悪いから。

また、Javaだと無名クラスでもそれなりに名前が付く。
なので「太郎が僕に」と言う事も可能だけど、
Javascriptだと無名にすると、Gobalオブジェクトのプロパティになる。
これは仕様。らしい。

なので太郎がとか次郎がとか言う訳では無く、
「神様が」
という事に成ってるのが本当は適当かもしれない。

31 queries. HTML convert time: 0.239 sec. Powered by WordPress 2.8