JSHint выдает «неопределенные» предупреждения в раскрывающемся шаблоне модуля - PullRequest
2 голосов
/ 18 января 2012

Я получаю несколько «неопределенных» ошибок при запуске этого кода в 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» и почему использование «вернуть это» является потенциальным строгим нарушением. Я знаю, что могу смело игнорировать неопределенную ошибку, связанную с пространством имен, так как функция пространства имен общего назначения ранее определена в отдельном файле.

Это просто случай прагматизма против строгой проверки?

Спасибо:)

1 Ответ

5 голосов
/ 18 января 2012

Относительно 'indicator' is not defined. и подобных ошибок: JSHint является производным от JSLint, который был написан Дугласом Крокфордом. У Крокфорда есть кое-что о вызовах функций, появляющихся в исходном тексте до того, как они будут определены, хотя это совершенно правильный и законный код, и нет никакой двусмысленности. Я на самом деле думаю, что это случай, когда JSLint (и JSHint, когда эта ошибка включена) активно противодействует & mdash; Я хочу знать, когда что-то действительно не определено, а не когда это не определено в соответствии с правилами стиля Крокфорда. (Не то чтобы у меня было мнение.)

Вы могли бы избежать этих ошибок, переместив объявления indicator и httpError выше request, но кроме ложных ошибок из JSHint, нет причин делать это.

Что касается ошибки на return this;, я полагаю, что это способ 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;
})();

Там нет строгого нарушения там вообще. bar вернет this, что, если я правильно вызову bar (например, var f = new Foo(); f.bar();), будет экземпляром объекта, созданного с помощью Foo, а не глобального объекта.

Если я изменю этот код, чтобы я не помог мне, мои инструменты помогли мне :

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

Ошибки не генерируются. Имена Foobar, Foo_bar и $bar также работают.

...