Jshint: Reguläre Parameter sollten nicht nach den Standardparametern kommen

Erstellt am 31. März 2016  ·  19Kommentare  ·  Quelle: jshint/jshint

> jshint -v
jshint v2.9.1

Datei um das Verhalten zu testen:

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

das Ergebnis von jshint a.js

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

1 error

Inhalt von .jshintrc :

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

Hilfreichster Kommentar

@derwaldgeist Klar! Hier ist ein Beispiel für eine .jshintrc Datei, die die Warnung stumm schalten würde:

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

Alle 19 Kommentare

Diese Nachricht wurde ursprünglich als JSHint-"Fehler" implementiert (was bedeutet, dass sie
nicht ignoriert werden): gh-1779. Obwohl es in einigen frühen Fällen ein SyntaxError war
Entwurf, er wurde nicht auf diese Weise fertiggestellt, also haben wir in gh-2543 den Entwurf "herabgestuft"
Nachricht zu einer Warnung. Dies bedeutet, dass Sie es in JSHint 2.9.1 über _kann_ ignorieren
-W138 .

Es bleibt jedoch unklar, ob diese Warnung überhaupt angebracht ist. ich
denke persönlich, dass so gestaltete Funktionen schwer zu bedienen sind, aber
Ich kann keine potenziellen Codesicherheitsprobleme identifizieren.

@rwaldron @caitp Hat einer von euch eine

Ich möchte nur erwähnen, dass eine solche Art von Signatur Teil von Redux-Codebeispielen ist. Suche nach der Zeile:

function counter(state = 0, action) {

es ist also IMHO weit verbreitet.

Diese Art von Muster ist _absolut_ die Definition von "Fusseln".

es ist also IMHO weit verbreitet.

Ich bin nicht einverstanden mit der Implikation, dass ein Muster, das in Redux erscheint, auf etwas "weit verbreitetes" hinweist. Ich habe Redux durchgesehen und Beispiele für counter(undefined, action) und ich frage mich, was der Sinn davon sein könnte, wenn man bedenkt, dass jeder von ihnen tatsächlich das action Argument _erfordert_ oder mit einer Laufzeit konfrontiert ist Error. Wenn action _immer_ erforderlich ist und state optional ist, warum erfordern Aufrufe, die explizit undefined – dies verfehlt den Zweck der Standardparameterwerte .

...ich bin versucht, einen Fehler zu melden.


Es bleibt jedoch unklar, ob diese Warnung überhaupt angebracht ist.

Ich glaube, das ist es, und jeder, der die Warnung nicht möchte, kann sie gerne ausschalten.

Fühlen Sie sich frei, dieses @jugglinmike zu schließen

@rwaldron ok, eigentlich diskutieren wir nicht über Redux. Können Sie ein Beispiel für einen Fehler bereitstellen, der bei einer solchen Signatur auftreten kann?
Für mich ist es nur eine Eigenschaft der Sprache. Was ist also der Grund, es als "falsch" zu markieren?

Können Sie ein Beispiel für einen Fehler bereitstellen, der bei einer solchen Signatur auftreten kann?

Der einzige Laufzeitfehler, auf den Sie stoßen werden, sind Aufrufe wie: counter() und counter(undefined) , aber das ist nicht mein Punkt. Mein Punkt ist, dass das ein schreckliches Design ist und dem Programmierer und seinen Werkzeugen eine unangemessene Last auferlegt. Ein Minifier könnte beispielsweise Folgendes vernünftigerweise analysieren:

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

Und produzieren:

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

Wobei die Standardeinstellung an erster Stelle steht:

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

würde produzieren:

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

Das ist ein ziemlich konstruiertes Beispiel, veranschaulicht aber dennoch meinen Standpunkt, dass es die Verwendung eines Standardparameters völlig und völlig sinnlos macht.

Für mich ist es nur eine Eigenschaft der Sprache.

Nur weil du kannst, heißt das nicht, dass du es solltest.

Im Moment können Sie also nicht erklären, warum es ein schlechtes Design ist, außer sich Sorgen über Fehler in Minifiern zu machen

Es wird als schlechte Praxis und falsche Verwendung von Standardparametern angesehen, dass alle Anrufseiten ein explizites undefined , um eine schlecht gestaltete Anrufsignatur zu umgehen.

Dieses Verhalten wird durch React/Redux gefördert. Ich entferne eher jshint als React/Redux :/

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

Ein netter Trick besteht darin, die Syntax der ES6-Standardargumente zu verwenden, um dies kompakter zu schreiben:

Funktion todoApp(state = initialState, Aktion) {
// Behandeln Sie vorerst keine Aktionen
// und geben Sie einfach den Status zurück, der uns übergeben wurde.
Rückgabestatus
}

@jugglinmike wdyt ^^ ?

@txm was passiert mit dem Parameter action , der nie verwendet wird?

Ich bin immer noch der Meinung, dass in Ermangelung einer greifbaren Gefahr (und sogar in
das Vorhandensein ansonsten unerwünschter Muster), sollte JSHint stumm bleiben.
Allerdings habe ich Probleme zu verstehen, wie @txm ist.

Wie kann ich es deaktivieren..?

@thalesfsp : Fügen Sie /* jshint -W138 */ hinzu und fügen Sie den Anfang Ihrer Datei hinzu. (Stellen Sie sicher, dass Sie jshint v2.9.1 oder neuer verwenden)

Stolperte über das gleiche Problem mit Redux. Kann dies bitte in der .jshintrc-Konfigurationsdatei deaktiviert werden?

@derwaldgeist Klar! Hier ist ein Beispiel für eine .jshintrc Datei, die die Warnung stumm schalten würde:

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

(Übrigens enthält die Dokumentation von JSHint weitere Informationen zum Deaktivieren bestimmter Warnungen.)

@jugglinmike Danke. Ich wusste nicht, dass es möglich ist, die Syntax "-Wxxx" auch in der .jshintrc-Datei zu verwenden. Ich habe dies immer am Anfang einer Datei verwendet. Gut zu wissen!

Da 'callback' häufig als letzter Parameter einer Funktion verwendet wird, erscheint mir diese Lint-Warnung ziemlich albern

openDialog(url, name, args = {}, pos) {
neues Versprechen zurückgeben (Funktion (auflösen, ablehnen) {
chrome.windows.create({
URL: URL,
Typ: "Popup",
Breite: Pos && Pos.Breite || nicht definiert,
Höhe: Pos && Pos.Höhe || nicht definiert,
links: Pos && Pos.links || nicht definiert,
oben: pos && pos.oben || nicht definiert
}, Funktion (w) {

Anscheinend ist die Standardeinstellung der anderen Parameter auf undefined gültig und besteht den Linting-Prozess. Ich sage nicht, dass das ein besseres Muster ist, aber es besteht den Linting-Prozess.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen