2012-01-18 84 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'以及爲什麼使用'return this'是一個潛在的嚴格違規行爲。我知道我可以放心地忽略與名稱空間有關的未定義錯誤,因爲通用名稱空間函數在前面的單獨文件中定義。

它只是一個實用主義與嚴格驗證的情況嗎?

謝謝:)

+0

請報出實際的錯誤。 – 2012-01-18 09:37:52

回答

5

關於'indicator' is not defined.和類似的錯誤:JSHint從JSLint的,寫由道格拉斯·克羅克福德的。克羅克福德在定義源文本之前就有一些關於調用函數的函數,即使它是完全正確的,合法的代碼,並且沒有任何含糊之處。我實際上認爲這是一個JSLint(和JSHint,當該錯誤啓用時)積極反對幫助  —我想知道什麼時候真的未定義,而不是當它是未定義 - 根據Crockford's-風格 - 規則。 (不,我有一個觀點。)

你可以通過移動indicator的聲明和httpError了上述request避免這些錯誤,但不是從JSHint虛假錯誤等,沒有理由這樣做。

關於對return this;錯誤,我相信這是告訴你,你正在返回全局對象的JSLint/JSHint的方式,因爲它預期開始用小寫字母的功能只是作爲函數調用,而不是一個pseudo-methods 。爲什麼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; 
})(); 

沒有任何嚴重的違規行爲。 bar將返回this,如果我正確呼叫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 2012-01-18 09:51:59

+0

@Matt:LOL ..... – 2012-01-18 10:04:54