2007/03/06

JavaScriptの恐怖

仕事でJavaScriptで作業。

まさかこんな罠があろうとは……

こんな感じのソース

function FuncA()
{
    for (i = 0; i < 10; i++){
       FuncB();
    }
}

function FuncB()
{
    for (i = 0; i < 10; i++) {
       work += i;
    }
}

このプログラムはまともに動かない。なぜならば変数のスコープに問題があるからだ。

VBでOption Explicitを使わずにこれと同じようなプログラムを組んだとしたらちゃんと動くだろう。VBの場合、関数外でPublic宣言されていない場合に関数内で変数が出てくるとそれはローカルの変数として解釈される。ところがJavaScriptの場合、関数内でVarで宣言しない限りグローバル変数として解釈される。つまり先の関数のfor文で使われている変数iは同じ変数なのである。

JavaScriptで変数を宣言する場合は出来るだけVarで宣言するように気をつけた方がよいという事になる。……なんだかなぁ……

あとJavaScriptには変数の型宣言がない為、変数は数値でも文字列でもどちらでも解釈されうる。よって「work += i;」という文は数値の加算処理にもなりうるし、文字列連結にもなりうる。

結構面倒な言語である。

3月 6, 2007 at 01:03 午前 プログラミング | | コメント (0) | トラックバック (0)

2006/01/24

C++Builder6.0のActiveX取り込みの謎2

しばらく調べてみたがC++Builder6でこの件に関する情報はまるで見つからなかった。しかしDelphi6のUpdatePack1のリリースノート(readme_61.txt)には

タイプライブラリインポータの問題

タイプライブラリのインポータに関連する問題がいくつか修正され
ました。
修正例:

配列プロパティが正しく生成されます。
MS HTML ライブラリを正しくコンパイルします。

というのがあった。まさにこの修正された項目がC++Builder6での不具合として発生している。

でもこのUpdatePack1ってC++Builder6より前にリリースされている訳で…


1月 24, 2006 at 11:01 午後 プログラミング | | コメント (0) | トラックバック (0)

2006/01/21

C++Builder6.0のActiveX取り込みの謎

配列プロパティを持つAcriveXを取り込むと配列プロパティの定義が○○_TLB.hに記述されなていない。Delphi7.0で取り込むと○○_TBL.pasにちゃんと定義が取り込まれているんだが…
試しに新規でActiveXを作りタイプライブラリエディタで配列プロパティを作ってみたが現象は同じ。しかし配列プロパティ自体はちゃんと機能している。
ググってみてもこの現象に関する情報は見つからないんだよなぁ……

1月 21, 2006 at 02:15 午前 プログラミング | | コメント (0) | トラックバック (0)

2004/11/27

NilしてからFree

って当たり前なんだろうか?

Delphiでの話なんだがこういうコードだった。
-----------------------------------------
var
 X : TClassX;
begin
(省略)
 X := nil;
 X.Free;
(省略)
end;
-----------------------------------------
まぁTClassXは(仮)と言うことで

これだとなんとなくnilポインタに対してFreeしている様にしか見えないんだけどなぁ・・・・

なおDelphiのSysUtilsユニットにはこんな関数がある。
-----------------------------------------
procedure FreeAndNil(var Obj);
var
 Temp: TObject;
begin
 Temp := TObject(Obj);
 Pointer(Obj) := nil;
 Temp.Free;
end;
-----------------------------------------
これならまだわかる。Tempに保持した上でnilをセットし、Temp側のFreeを呼んでいる。

11月 27, 2004 at 03:23 午後 プログラミング | | コメント (2) | トラックバック (0)