2012-01-18 8 views
2

を明らかに「未定義」の警告を投げ:JSHintはJSHintでこのコードを実行するとき、私はいくつかの「未定義の」エラーを取得していますモジュールパターン

MERLIN.namespace('MERLIN.http'); 

MERLIN.http = function ($, window) { 
    'use strict'; 
    // import dependencies 

    function request(config) { 
     if (!config || typeof config !== 'object') { 
      return; 
     } 
     // perform request 
     $.ajax({ 
      type: config.type || 'GET', 
      url: config.url, 
      dataType: config.dataType, 
      data: config.data || {}, 
      processData: config.process || false, 
      beforeSend: function() { 
       indicator(config.panel, config.indicator); 
      }, 
      complete: function() { 
       indicator(config.panel, config.indicator); 
      }, 
      success: function (resp) { 
       var callback = config.success || null; 
       if (typeof callback !== 'function') { 
        callback = false; 
       } 
       if (callback) { 
        callback.apply(this, [resp]); 
       } 
      }, 
      error: function (xhr, textStatus, errorThrown) { 
       httpError({ 
        xhr: xhr, 
        status: textStatus, 
        error: errorThrown, 
        panel: config.panel 
       }); 
      } 
     }); 
    }; 

    function indicator(panel, type) { 
     if ((!panel || typeof panel !== 'string') || (!type || typeof type !== 'string')) { 
      return; 
     } 
     var indicatorType = (type === 'large') ? type = 'indicatorLarge' : type = 'indicatorSmall'; 
     return $(panel).toggleClass(indicatorType); 
    }; 

    function httpError() { 
     return this; 
    }; 

    return { 
     request: request, 
     error: httpError 
    }; 

} (jQuery, this); 

未定義のエラーは「指標」のためにスローされている理由は、私はわかりません「httpError」と、なぜ「これを返す」の使用が潜在的な厳格な違反であるのか。私は、汎用名前空間関数が別のファイルで先に定義されているので、名前空間に関する未定義のエラーを安全に無視できることを知っています。

これは、プラグマティズムと厳格な検証の単なるケースですか?

おかげ:) 'indicator' is not defined.と同様のエラーについて

+0

実際のエラーを引用してください。 –

答えて

5

:JSHintはダグラス・クロックフォードによって書かれたJSLint、から誘導されます。 Crockfordは、完全に正確で法的なコードであり、まったく曖昧さはありませんが、定義される前にソーステキストに表示される関数の呼び出しに関することを持っています。私は実際にはこれがJSLint(そしてそのエラーが有効になっているときはJSHint)のケースだと思っています。  —私は何かがいつ知りたいのですか本当には未定義ではありません。Crockford's-ルール(私は意見を持っていないこと。)

あなたはindicatorの宣言とrequest上記アップhttpErrorを移動することで、これらのエラーを回避できますが、JSHintから偽のエラー以外、そうする理由はありません。

return this;のエラーについては、小文字で始まる関数は単に関数と呼ばれ、pseudo-methodsではないことを期待しているので、グローバルオブジェクトを返すことをJSLint/JSHintの方法で伝えます。 。なぜhttpError返信this?あなたがそれを呼び出す方法は、thisがグローバルオブジェクトになります。

そのような場合にグローバルオブジェクトを返すのは間違いありませんが、そのエラーを完全に間違って取得することもできます。たとえば、このコードでは次のようなエラーが発生します。

var Foo = (function() { 
    "use strict"; 

    function Foo() { 

    } 
    function bar() { 
     return this; // "ERROR: [8:16]: Strict violation." 
    } 
    Foo.prototype.bar = bar; 

    return Foo; 
})(); 

厳密な違反はありません。 barthisを返します。barを正しく呼び出すと(var f = new Foo(); f.bar();など)、グローバルオブジェクトではなくFooで作成されたオブジェクトのインスタンスになります。

私はないhelp my tools help meを行うように私はそのコードを変更する場合:

var Foo = (function() { 
    "use strict"; 

    function Foo() { 

    } 

    Foo.prototype.bar = function() { 
     return this; 
    }; 

    return Foo; 
})(); 

JSLint/JSHintが機能以外の何かにthisセットで呼び出されることを前提としているため...エラーは、離れて行きますグローバルオブジェクトしかし、私の機能は匿名であり、それは理想的ではありません。

しかし、関数名を小文字以外で始めることで、JSLint/JSHintを幸せにすることができます。たとえば、私の通常の命名規則が動作します。

var Foo = (function() { 
    "use strict"; 

    function Foo() { 

    } 
    function Foo$bar() { 
     return this; 
    } 
    Foo.prototype.bar = Foo$bar; 

    return Foo; 
})(); 

エラーは発生しません。 FoobarFoo_bar、および$barの名前もすべて機能します。

+3

['++ vote' ...ああ待って、申し訳ありません....' vote + = 1'](http://stackoverflow.com/questions/971312/why-avoid-increment-and-decrement-operators- in-javascript) – Matt

+0

@Matt:LOL ..... –

関連する問題