2014-10-09 2 views
24

jshint выдает ошибку при определении углового модуля (или директивы или фабрики), как рекомендовано направляющими углового типа (по John Papa или Todd Motto). Например, для контроллера, как это:Значит ли jshint Angular?

(function() { 
    'use strict'; 

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

    function theController() {...} 

})(); 

... jshint выдает эту ошибку:

'theController' was used before it was defined. 

Угловая приложение работает отлично, несмотря на эти ошибки. Однако я не знаю, почему протесты jshint ...

Что мне не хватает? Интересно, является ли jshint хорошим оценщиком качества углового кода (несмотря на то, что он включен в популярные пакеты как генератор-угловые), или это я, что я делаю что-то неправильно (хотя мое приложение работает).

Заранее благодарен!

+3

Переведите определение функции 'theController' над вашим угловым кодом.Современные двигатели JS будут смотреть вперед и находить ваше определение функции перед выполнением, но более старые двигатели выполняются сверху вниз (и я думаю, что для этого необходим «строгий» режим). –

+4

Я думал, что функция подъема сделает это не проблема –

+1

Значит ли jshint JavaScript *. ANGULAR JS - JAVASCRIPT. НИЧЕГО БОЛЬШЕ –

ответ

15

хорошо первый из включают в себя угловой в ваших «глобалам переменных», например:

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

затем переместить определение функции, прежде чем ссылаться на него угловой.

(function() { 
    'use strict'; 

    function theController() {...} 

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

Проблема решена! Спасибо за ответы на все вопросы. @ jack-the-ripper, он работал, просто переместив определение функции, как вы предложили. Во всяком случае, я также добавил «угловое» в globals в файле .jshintrc, как вы предложили. Еще раз спасибо! –

+2

проблема заключается в том, что руководство по угловому стилю защищает стиль определения функций ниже, а затем привязывает их к публичной конечной точке вверху (т.е. 'this.foo = internalFoo' ... вверху' function internalFoo() {} 'внизу) https://github.com/johnpapa/angular-styleguide –

2

Ваш код должен работать, но jshint будет пытаться заставить вас код в очень строгой манере. По крайней мере, это «хорошая практика», чтобы ваши функции были определены до их использования. Как я уже упоминал в комментарии выше, я думаю, что более старые javascript-движки выполняются сверху донизу (не помню наверняка, хотя и не могут протестировать) - поэтому, если вы собираетесь поддерживать как можно большую поддержку, вам нужно будет послушайте jshint.

Что-то здесь следует отметить, что если вы используете var ключевое слово, чтобы определить свою функцию, вы получите ошибку - лучше всего объяснить на примере:

Это работает (http://jsfiddle.net/ryanwheale/kr8L825p/)

(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 :)"); 
    } 
})(); 

.. ., но это не (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

Используйте latedef свойство и установить его на false. Это позволяет поднимать функции, которые ИМО в порядке. Но все же сообщается о подъеме варов, что плохо. IMO

+1

Почему бы не сделать уступку Crockford и [объявить функцию, которую вы собираетесь использовать в первую очередь] (http://stackoverflow.com/a/27296661/1028230) прежде чем вернуться в свой предпочтительный поток и определить его? Тогда все [кажется!] Счастливы. – ruffin

+3

Я предпочитаю держать код, который управляет намерением вверху, над складкой. при этом функции и интерфейс вверху это делают. вы можете сделать это так, как вам нравится (это работает). но именно поэтому я делаю это: сделать его мгновенно идентифицируемым, так как я открываю файл относительно того, что он делает и как его использовать. подробности следуют –

+1

Нет, я понимаю. Я говорю, что [ответ выше делает оба - следуйте вашим советам ** и ** lints] (http://stackoverflow.com/a/27296661/1028230). У вас есть * одна * тривиальная дополнительная строка, чтобы объявить функцию (ы), чтобы сделать линт счастливым, а затем все «детали следуют», как и раньше. Ваш стиль руководства несет вес, но его конфликты с линтами вызывают пару таких вопросов, как этот. В строке декларации сохраняются ваши идеалы намного лучше, чем этот [текущий ответ] (http://stackoverflow.com/a/26288458/1028230), и остановит конфликты. 2 ¢ и т. Д. – ruffin

5

Таким образом, еще один вариант, который делает каждый счастливый листинг, заключается в объявлении переменной, которая сначала будет удерживать функцию, использовать ее как параметр, а затем определить ее.

Но лично я не уверен, что мне нравится поток здесь. Я думаю, мне нравится ответ Джек лучше, но это немного ближе к тому, что, по-видимому, предпочитает папа, если вы с его style guide. На самом деле, я не уверен, почему это не то, что он рекомендует, если он действительно хочет, чтобы функции появлялись после того, как они были использованы (и он это делает). В противном случае вы не можете использовать его стиль с latedef установлен в true в JSHint - или JSLint на всех.

(function() { 
    'use strict'; 
    var theController; 

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


    theController = function() { 
     return "so jslint doesn't complain about empty blocks"; 
    }; 
}()); 
Смежные вопросы