Относительно '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
также работают.