2009/02/04
JavaScriptで再びくだらないバグ
JavaScript、特にprototype.jsとRubyを同時に書くのは鬼門です。似すぎるがゆえの悲劇があります。
JavaScriptで次のようなコードを書いてしまいました。クラス名の部分は引用のために適当に変えています。class-fooの要素でclass-barではない要素を取得するコードです(イディオム?)。
var elements = $A($$('.class-foo').reject(function(e) { e.hasClassName('class-bar'); });
JavaScriptを書き慣れた人には自明ですが、次のようにreturn文を書く必要があります。
var elements = $A($$('.class-foo').reject(function(e) { return e.hasClassName('class-bar'); });
JavaScriptには脱力バグが多いです。偏見かもしれませんが。
JavaScriptでreturn文のない関数の返り値は undefined になって、真偽値として評価すると偽になります。
// firebug上 > function f() {} > var x = f() > typeof x "undefined" > if (x) alert('t'); else alert('f') // 'f'
ちなみにRubyで空のメソッドの返り値はnilになって、現象的には似たような結果です(Rubyで偽になるのはnilとfalseのみ)。
# irb > def f; end > x = f > x.class #=> NilClass > p 'f' unless x # 'f'
returnのない関数の返り値の型はvoid(undefinedのままでもいいですが)にして、真偽値の評価をエラーにしてくれればいいのですが。条件式にはboolean型しか許さないJavaは素晴らしいのでしょう(いちいち、!= null と書くのが面倒くさいと文句言いつつも)。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/javascript-returns/tbping