Подтвердить что ты не робот

Знает ли jshint Angular?

jshint генерирует ошибку при определении модуля angular (или директивы или factory), как рекомендовано руководствами стиля angular (John Papa или Тодд Мотто). Например, для такого контроллера:

(function () {
    'use strict';

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

    function theController() {...}

})();

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

'theController' was used before it was defined.

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

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

Спасибо заранее!

4b9b3361

Ответ 1

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

Ответ 2

Сначала сначала включите angular в ваши "переменные глобалов", например:

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

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

(function () {
    'use strict';

    function theController() {...}

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

Ответ 3

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

Но лично я не уверен, что мне нравится поток здесь. Думаю, мне нравится, что ответчик лучше ответит, но это немного ближе к тому, что, по-видимому, предпочитает Папа, если вы опустили его руководство по стилю. На самом деле, я не уверен, почему это не то, что он рекомендует, если он действительно хочет, чтобы функции появлялись после того, как они были использованы (и он это делает). В противном случае вы не можете использовать свой стиль с 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";
    };
}());

Ответ 4

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

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

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

(function() {
    try {
        foo();
    } catch(ex) {
        alert("ahhhhh, what 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 going on?!?!?\n\n" + ex.message);
    }

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