2014-10-09 14 views
24

jshint, Açısal stil kılavuzları tarafından önerilen bir açısal modül (veya yönerge veya fabrika) tanımlarken hata veriyor (John Papa veya Todd Motto). Örneğin, böyle bir denetleyici için:jshint Angular'ı anlıyor mu?

'theController' was used before it was defined. 

açısal uygulaması bu hataları rağmen mükemmel çalışıyor:

(function() { 
    'use strict'; 

    angular 
     .module('myApp') 
     .controller('myAppCtrl', theController); 

    function theController() {...} 

})(); 

... jshint bu hatayı atar. Ancak neden jshint protesto ettiğini bilmiyorum ...

Neyi özlüyorum? Jshint'in açısal kodun kalitesinin iyi bir değerlendiricisi olup olmadığını merak ediyorum (jeneratör-açısal olarak popüler paketlere dahil olmasına rağmen) ya da ben yanlış bir şey yapıyorum (app'ım çalışmasına rağmen).

Şimdiden teşekkürler! iyi ilk

+3

'theController' işlev tanımınızı açısal kodunuzun üzerine getirin.Modern JS motorları, ilerde bulunmadan önce ileriye bakacak ve işlev tanımınızı bulacaktır, ancak daha eski motorlar yukarıdan aşağıya doğru çalışacaktır (ve "sıkı" modun bunu gerektirdiğini düşünüyorum). –

+4

Yüklemenin bir sorun olmadığını düşünürdüm –

+1

jshint JavaScript'i biliyor mu *. ANGULAR JS JAVASCRIPT'tır. DAHA FAZLA BİLGİ –

cevap

15

örneğin, "globaller değişkenler" in açısal şunlardır: Eğer köşeli onu referans önce

"globals": { // Global variables. 
     "jasmine": true, 
     "angular": true, 
     "browser": true, 
     "element": true, 
     "by":true, 
     "io":true, 
     "_":false, 
     "$":false 
    } 

ardından işlevi tanımı taşıyın.

(function() { 
    'use strict'; 

    function theController() {...} 

    angular 
     .module('myApp') 
     .controller('myAppCtrl', theController); 
})(); 
+1

Sorun çözüldü !! tüm cevaplar için teşekkürler. @ jack-the-ripper, sadece önerdiğiniz gibi fonksiyon tanımını hareket ettirerek çalıştı. Her neyse, önerdiğin gibi .jshintrc dosyasındaki globals'a "açısal" ekledim. Tekrar teşekkürler! –

+2

problemi, açısal stil kılavuzu aşağıdaki işlevleri tanımlamak için bir stili destekliyor ve daha sonra bunları bir genel uç noktaya (örneğin, this.foo = internalFoo' ... yukarıdan yukarı 'function internalFoo() {}) https://github.com/johnpapa/angular-styleguide –

2

Kodunuz çalışır, ancak jshint deneyin ve çok sıkı bir şekilde kodlamak için almak için gidiyor olmalıdır. En azından, işlevlerinizi kullanmadan önce tanımlamanız bir "iyi uygulama" dır. Yukarıda açıklamada belirtildiği gibi, daha yaşlı JavaScript motorları altındaki (gerçi kesin hatırlayamıyorum ve test edemez) yukarıdan yürütmek düşünüyorum - böylece geniş olarak-mümkün destek için gidiyoruz eğer isteyeceksiniz Jshint'i dinle. Burada kayda değer

şey size işlevini tanımlamak için var anahtar kelimeyi kullanırsanız, bir hata alacak - en iyi örnekle açıkladı:

Bu (http://jsfiddle.net/ryanwheale/kr8L825p/) çalışır

(function() { 
    try { 
     foo(); 
    } catch(ex) { 
     alert("ahhhhh, what's going on?!?!?\n\n" + ex.message); 
    } 

    function foo() { 
     alert("I was hoisted to the top of this scope before execution :)"); 
    } 
})(); 

.. . Bu does not (http://jsfiddle.net/ryanwheale/kr8L825p/4/)

(function() { 
    try { 
     foo(); 
    } catch(ex) { 
     alert("ahhhhh, what's going on?!?!?\n\n" + ex.message); 
    } 

    var foo = function() { 
     alert("I was hoisted to the top of this scope before execution :)"); 
    } 
})(); 
18

Kullanım latedef mülkiyet ama veayarlayın. Bu, IMO'nun iyi olduğu işlevlerin yüklenmesine izin verir. Ancak yine de, IMP'lerin varsayılan raporlar, bu IMO

+1

Neden imtiyazı Crockford'a yapmıyorsunuz ve [ilk olarak kullanacağınız işlevi bildiriniz] (http://stackoverflow.com/a/27296661/1028230) Tercih ettiğiniz akışa geri dönmeden ve tanımlamadan önce? Sonra herkes [görünüyor!] Mutlu. – ruffin

+3

Girişin üst tarafına, üst kısmın üst tarafına sürülen kodu tutmayı tercih ediyorum. İşlevler koymak ve üstte bulunan arayüz bunu yapar. İstediğiniz şekilde yapabilirsiniz (çalışır). ama bu yüzden bunu yapıyorum: dosyayı ne yaptığına ve nasıl kullanılacağına göre açtığımı anında tanımlamak. ayrıntılar –

+1

Hayır, anlıyorum. Diyorum ki [yukarıdaki cevap her ikisi de - tavsiyenizi izler ** ve ** lints] (http://stackoverflow.com/a/27296661/1028230). Linterleri mutlu etmek için fonksiyon (lar) ı bildirmek için * bir * önemsiz ekstra çizgi var ve daha sonra tüm detaylar daha önce olduğu gibi. Stil rehberiniz ağırlık taşıyor, ancak linterlerle olan çelişkileri SO'da bunun gibi birkaç soruna neden oluyor. Bildiri çizgisi, ideallerinizin, şu anda [şu andaki cevap] (http://stackoverflow.com/a/26288458/1028230) 'den çok daha iyi olduğu ve lint çatışmalarını durduracağı yönündedir. 2 ¢, vb – ruffin

5

Bu nedenle, her linter'i mutlu kılan bir başka seçenek, önce işlevi tutacak olan değişkeni bildirmek, onu bir param olarak kullanmak ve sonra tanımlamaktır.

Ama şahsen ben buradaki akışı sevdiğimden emin değilim. Daha iyi Jack'in cevabını düşünüyorum, ama bu Papa aşağı onun style guide ile iseniz, tercih görüneni biraz daha yakın olduğunu. Bu gerçekten kullanıldıkları sonra görünmesini işlevleri istiyorsa o önerir (ve yaptığı) ne değildir neden Aslında ben emin değilim. Aksi takdirde, , stilini latedef JSHint - veya JSLint öğesinde öğesinde doğru olarak ayarlayamaz.

İlgili konular