> 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
}
Это сообщение изначально было реализовано как «ошибка» 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
является допустимой и проходит процесс линтинга. Я не говорю, что это лучший образец, но он проходит процесс линтинга.
Самый полезный комментарий
@derwaldgeist Конечно! Вот пример файла
.jshintrc
, который отключит предупреждение: