Jshint: Обычные параметры не должны стоять после параметров по умолчанию

Созданный на 31 мар. 2016  ·  19Комментарии  ·  Источник: jshint/jshint

> jshint -v
jshint v2.9.1

файл для проверки поведения:

var a = function(x = 1, i) {}

результат jshint a.js

a.js: line 1, col 26, Regular parameters should not come after default parameters.

1 error

содержимое .jshintrc :

{
  "asi": true,
  "esversion": 6
}
Needs Discussion

Самый полезный комментарий

@derwaldgeist Конечно! Вот пример файла .jshintrc , который отключит предупреждение:

{
  "esversion": 6,
  "-W138": true
}

Все 19 Комментарий

Это сообщение изначально было реализовано как «ошибка» JSHint (что означает, что оно могло
нельзя игнорировать): gh-1779. Хотя это могло быть SyntaxError в некоторых ранних
черновик, он не был доработан таким образом, поэтому в gh-2543 мы "понизили"
сообщение к предупреждению. Это означает, что вы _ можете_ проигнорировать его в JSHint 2.9.1 через
-W138 .

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

@rwaldron @caitp У кого- нибудь из вас есть какие-нибудь мысли по этому

Сразу хочу отметить, что такая подпись является частью примеров кода redux. Ищите строку:

function counter(state = 0, action) {

так что он широко используется, ИМХО.

Этот вид шаблона - абсолютное определение «ворса».

так что он широко используется, ИМХО.

Я категорически не согласен с тем, что шаблон, который появляется в redux, указывает на что-то «широко используемое». Я просмотрел redux и нашел примеры counter(undefined, action) и мне осталось интересно, в чем может быть смысл этого, учитывая, что каждый из них фактически _requires_ аргумент action или сталкивается с временем выполнения ошибка. Если action является _ всегда_ обязательным, а state - необязательным, зачем требовать вызовы, которые должны явно передавать undefined - это противоречит цели значений параметров по умолчанию .

... Я хочу сообщить об ошибке.


Тем не менее, остается неясным, уместно ли это предупреждение вообще.

Я верю, что это так, и любой, кто не хочет получать предупреждение, может отключить его.

Не стесняйтесь закрыть это @jugglinmike

@rwaldron, ладно, на самом деле мы не обсуждаем редукцию. Можете ли вы предоставить образец ошибки, которая может появиться с такой подписью?
Для меня это просто свойство языка. Итак, по какой причине отмечать это как «неправильное»?

Можете ли вы предоставить образец ошибки, которая может появиться с такой подписью?

Единственная ошибка времени выполнения, с которой вы столкнетесь, - это вызов типа: counter() и counter(undefined) , но это не моя точка зрения. Я хочу сказать, что это ужасный дизайн и ложится чрезмерной нагрузкой на программиста и его инструменты. Например, минификатор мог бы разумно проанализировать следующее:

function counter(action, state = 0) {
  return [action, state];
}
counter({});
counter({}, 0);
counter({}, undefined);

И производим:

function c(a,s=0){return[a,s]}
c({});
c({});
c({});

Принимая во внимание, что сначала ставим значение по умолчанию:

function counter(state = 0, action) {
  return [state, action];
}
counter(0, {});
counter(undefined, {});

произвел бы:

function c(s=0,a){return[s,a]}
c(0, {});
c(undefined, {});

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

Для меня это просто свойство языка.

То, что вы можете, не означает, что вы должны это делать.

Итак, в настоящий момент вы не можете объяснить, почему это плохой дизайн, кроме как беспокоиться об ошибках в минификаторах.

Требование ко всем сайтам вызовов передавать явное значение undefined для обхода плохо спроектированной сигнатуры вызова считается плохой практикой и неправильным использованием параметров по умолчанию.

Такое поведение поддерживается React / Redux. Я скорее удалю jshint, чем удаляю React / Redux: /

http://redux.js.org/docs/basics/Reducers.html

Один изящный трюк - использовать синтаксис аргументов по умолчанию ES6, чтобы записать это более компактно:

функция todoApp (состояние = начальное состояние, действие) {
// Пока не обрабатываем никаких действий
// и просто вернем данное нам состояние.
состояние возврата
}

@jugglinmike wdyt ^^?

@txm что происходит с параметром action который никогда не использовался?

Я по-прежнему придерживаюсь мнения, что при отсутствии ощутимой опасности (и даже в
наличие нежелательных в противном случае шаблонов) JSHint должен хранить молчание.
Тем не менее, мне сложно понять, чем @txm .

Как я могу это отключить ..?

@thalesfsp : Добавить /* jshint -W138 */ добавить начало файла. (Убедитесь, что вы используете jshint v2.9.1 или новее)

Наткнулся на такую ​​же проблему с Redux. Можно ли это отключить в конфигурационном файле .jshintrc, пожалуйста?

@derwaldgeist Конечно! Вот пример файла .jshintrc , который отключит предупреждение:

{
  "esversion": 6,
  "-W138": true
}

(Кстати, в документации JSHint есть дополнительная информация об отключении определенных предупреждений.)

@jugglinmike Спасибо. Я не знал, что можно использовать синтаксис «-Wxxx» и в файле .jshintrc. Я всегда использовал это в начале файла. Приятно знать!

Поскольку «обратный вызов» широко используется в качестве последнего параметра функции, это предупреждение о ворсинах кажется мне довольно глупым.

openDialog (url, name, args = {}, pos) {
вернуть новое обещание (функция (разрешить, отклонить) {
chrome.windows.create ({
url: url,
тип: "всплывающее окно",
width: pos && pos.width || неопределенный,
height: pos && pos.height || неопределенный,
left: pos && pos.left || неопределенный,
вверху: pos && pos.top || неопределенный
}, function (w) {

По-видимому, установка других параметров по умолчанию на undefined является допустимой и проходит процесс линтинга. Я не говорю, что это лучший образец, но он проходит процесс линтинга.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги