Bug-org 212723が開かれていよいよ動き始めている。
気になるニュース。 特に最後の段落が。
Mozilla Foundation設立に関する他の情報。
1日遅れでニュースが出ていた。
この例のような場合に、 func2 でも func3 でも value is LOCAL を表示して欲しいところが、 それぞれの関数が参照する
value
はその関数が定義されたときのスコープのものになっているから、 func1 と違う結果になる、と。
Javascriptは詳しくないんで外しているかもしれませんが、 これって関数へのポインタなのではないでしょうか? 元々のソースっぽいものをDelphi(Object Pascal)で記述してみると次のようになると思います。
type TNoParamFunc = function(): Integer of object; TClass1 = class private FFunction1Handler: TNoParamProc; FFunction2Handler: TNoParamProc; function func1: Integer; public constructor Create; override; end; TClass2 = class public function func2: Integer; end; var class1: TClass1; class2: TClass2;
constructor TClass1.Create; begin inherited; FFunction1Handler := func1; FFunction2Handler := class2.func2; end;
これでTClass1内でFFunction2Handlerをコールすれば、 class2のfunc2をコールしたことになります。
要はクラス外にある関数の位置を記憶しているだけで、 そのクラス内に外部の関数を取り込んだ訳ではないので変数のスコープに誤解が生じているのではないかと。
例のソースがC++のようなメジャーな言語じゃなくて申し訳ないですね(^-^;
もうちょっとだけ補足しておくとTClass1内でFFunction1Handler();
と記述すると、
func1();
と記述したのと同じことになります。
つまり、FFunction1Handlerの実行時には呼び出しもとと同じスコープを持ち、
同じメンバ変数を参照できることになります。
それに対してFFunction2Handler();
と記述すると、
class2.func2();
と記述したのと同じことになります。
つまり、呼び出しもとがTClass1内であっても、
FFunction2Handlerの実行時に呼び出されるのは全く異なるスコープを持つclass2のfunc2関数なわけです。
関数へのポインタは、それにセットする関数のエイリアス(別名)みたいなものだと言った方がわかりやすいのかもしれません。 決して関数そのもののコピーを作っているわけではありません。 実際にはイベントハンドラやコールバック関数として使えるのでもっと便利なものです。
ダブルクリックで文字列を選択して、 そのまま(二回目のクリックでマウスのボタンを押したまま)左に選択範囲を広げようとすると選択範囲の左端からカーソル位置が選択範囲となっていたというバグ。
2003072204-trunkでこのバグが修正され、ダブルクリック時の右端からカーソル位置が選択範囲になるようになっている。
個人的にはどうでもいい問題だが、こういう修正は便利に感じる人は便利なのではないだろうか。
その関数が定義されたときのスコープのものになっているから、
この部分から勘違いがあるんじゃないかと心配になって書いただけなんで、 コピーではなく、参照だと分かっているのであればそれでいいです。
ちなみに私は関数へのポインタという概念の意味が全く理解不能でした。 メモリにあるもの、イコール、データという固定概念があったためでしょうか。 C言語 ポインタ完全制覇を読んで感覚がつかめましたけど。
:hoverで画像を相対配置で移動させると、その画像がline-heightの高さ分しか表示されなかった問題。
本当にようやくという感じが強いバグだが、 こういった古い(目立つ)バグの修正が相次いでいるというのは非常に良い状況だ。