2015-03-16 2 views
0

Когда я JSLint этот код:Почему JSLint говорит, что «анонимная функция не всегда возвращает значение» для обработчика события?

$(document).keydown(function(e){ 
    if ($("#chaptersFunctionality").length !== 0) { 
     if (e.keyCode == '13') 
      return false; 
     if ($("#kelvin").val() === "" && $("#caleb").attr("title") === "Show all steps") { 
      switch(e.which){ 
      case 39: if ((parseInt(currentAnchor)+1) < parseInt(maxi)) 
       expandMe(++currentAnchor); 
       break; 
      case 37: if (currentAnchor > 0) 
       expandMe(currentAnchor-1); 
       break; 
      } 
     } 
    } 
}); 

... Я получаю много предупреждений, большинство из которых я ГРОК, но это один имеет меня в тупик: «анонимная функция не всегда возвращает значение»

Почему это так? Обработчик событий не является анонимной функцией, не так ли? И все равно это не возвращает никакой ценности, не так ли? Итак, что это значит и что будет [moll, pac] ify linter?

+2

Обработчик событий - это функция. Эта функция может быть анонимной (и находится в вашем примере кода). Обработчик событий также может вернуть значение (и делает это в вашем примере кода, см. Строку «return false»). Однако, если первая внутренняя ветвь 'if' не будет принята, то оператор' return' не будет выполнен, и ваш обработчик по умолчанию будет возвращать 'undefined'. Похоже, JSLint этого не ценит. –

ответ

4

JSLint предупреждает вас, когда функция имеет несколько ветвей, которые сталкиваются с return и другими ветвями, которые заканчиваются без столкновения с return. JSLint считает, что функция должна либо всегда явно возвращать значение, либо никогда явно возвращает значение. Функция, которая иногда явно возвращает значение, сама получает предупреждение. Ваш код делает return false в одном случае и в противном случае никогда не использует return.

Если вы хотите успокоить JSLint, вы можете разместить return undefined; в нижней части своей функции, чтобы он всегда явно возвращал что-то.

Теперь, по-моему:

Когда дело доходит до слушателей событий, это 100% приемлемо для возврата значения только иногда. Внутренний движок браузера, который использует ваше событие прослушивателя return, уже запрограммирован на прием возвращаемого значения или отсутствие возвращаемого значения.

Поскольку практика не возвращать значение в прослушивателе событий совершенно нормально, это не повредит читабельности вашего кода. Я думаю, вы можете смело игнорировать JSLint в этом случае.

+3

Незначительный nitpick: функция не «иногда возвращает значение», и она не может «не иметь возвращаемого значения». Функция * * возвращает 'undefined' в этих случаях независимо от того, сделаете ли вы это самостоятельно или нет. Я бы предложил не игнорировать ошибку и умиротворить JSLint так, как вы изначально предлагаете. Как говорит Крокфорд, JSLint повредит вашим чувствам (http://www.jslint.com/lint.html), но в этом все дело. Если вам нужен постоянный код, особенно при работе в распределенной группе, линтеры обойдутся чувствами и сохранят весь ваш код в границах linter. Это их * raison d'etre *. ; ^) – ruffin

+0

@ruffin Я изменил «возврат» к «явно возвращению» в этих случаях. Я думаю, что остальная часть вашего комментария очень хорошая; это помогло мне понять немного лучше цель линтеров. – apsillers

+0

Ницца - это незначительно, но важно, особенно когда JSLinting, я думаю. Сравните с правилом Крокфорда о «небезопасности» в регулярных выражениях. Его предвзятость всегда для явного контроля и ответственности. Итак, если вы явно возвращаете 'undefined' в нулевом случае, даже если какой-либо случайный движок JavaScript по умолчанию * не * возвращает' undefined', когда функция не использует 'return', ваша функция будет продолжать работать с тем же как это было раньше. Во всяком случае, круто, спасибо. Извините, что ницпик. – ruffin