Функция jsHint не определена, порядок объявлений функций имеет значение?

Передача этого кода через jsHint:

var A = function (spec) { 
  "use strict";
  var a = function () {
    return b();
  };

  var b = function () {
    return 5;
  };

  a();
};

возвращает эту ошибку:

Line 4: return b();
'b' is not defined.

Я понимаю, что это может быть связано с "подъемом", как описано здесь: Порядок функций JavaScript : почему это важно?

Однако следующий код возвращает ту же ошибку:

var A = function (spec) { 
  "use strict";
  function a () {
    return b();
  }

  function b () {
    return 5;
  }

  a();
};

Если я правильно понимаю, по крайней мере второй фрагмент кода не должен возвращать ошибку. Я ошибаюсь?

Даже учитывая механизм подъема, я все еще не понимаю, почему первый фрагмент кода должен быть неправильным. Функция a вызывается только после определения функции b, поэтому b будет в замыкании a. Мой код неправильный или jsHint неправильный?

Я понимаю, что этот вопрос чисто академический, потому что код работает как положено во всех браузерах. Тем не менее, я хотел бы знать, почему jsHint выдает ошибку.


person jonemo    schedule 07.11.2011    source источник


Ответы (3)


Это ложное срабатывание в jsLint.
Оба ваших фрагмента кода работают нормально.

Не обращайте внимания на предупреждение.

person SLaks    schedule 07.11.2011
comment
Я не знаю, почему jsLint (и его форк) игнорирует подъем оператора функции. - person SLaks; 07.11.2011
comment
Я думал, что это описано в нескольких проблемах в их github: 61, 47, 29. 29 закрыт в марте 2011 г. с комментарием о том, что проблема исправлена ​​(в их главной ветке в любом случае). - person jonemo; 07.11.2011

Первый пример — это проблема подъема, потому что a() ссылается на b() до того, как она будет объявлена. Решение состоит в том, чтобы иметь 'var a, b;' после вашего «строгого использования»; утверждение.

person jmulligan    schedule 07.11.2011

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

В этом случае это не очень хорошо, потому что человеку может быть трудно понять, даже если это совершенно правильный Javascript.

person Matt Fenwick    schedule 07.11.2011