JSLintを使ってみた。
JSLintというJavaScriptの検証器を発見したので、早速ContainerJSをチェックしてみました。WebUIが用意されているのでソースコードをコピペしてボタンを押すだけ。簡単に使えます。で、以下が見つかった不具合。
行の終わりにセミコロンがない。
なにげに結構あった。orz..意外と忘れるもんだなー。(Rubyのせい、という説あり。)
"]" のあとで改行されている
if ( def && def[container.Annotation.Container] // ← ここ && def[container.Annotation.Container][container.Annotation.Scope] == container.Scope.EagerSingleton ) { thiz.create( def ); }
セミコロン忘れにつながるのでエラーとして扱っているらしい。これは別にいいんじゃね?
変数を2重に宣言
以下のようなパターンがあった。
if ( nameOrType instanceof container.Type ) { // キャッシュがなければスキャン if ( !this.typeCache[nameOrType] ) { this._createTypeCahce( nameOrType ); } var defs = this.typeCache[nameOrType] // ←ここで宣言した「defs」を for ( var i=0; i < defs.length; i++ ) { objects.push( this.create( defs[i]) ); } } else { if ( this.nameCache[nameOrType] ) { var defs = this.nameCache[nameOrType]; // ← 再度宣言している for ( var i=0; i < defs.length; i++ ) { objects.push( this.create( defs[i]) ); } } }
とか、
for ( var i=0; i < params.length; i++ ) { // ←ここで宣言した「i」を tmp[params[i]] = org[params[i]]; } tmp[container.Annotation.Intercept] = []; if ( org[container.Annotation.Intercept] ) { var list = org[container.Annotation.Intercept]; for ( var i=0; i < list.length; i++ ) { // ← 再度宣言している tmp[container.Annotation.Intercept].push( list[i] ); } }
とか。ブロックスコープはないんだよなー。気をつけよう。