wake-up-neo.net

Ordnungsgemäße Verwendung von const zum Definieren von Funktionen in JavaScript

Ich bin interessiert, ob es Beschränkungen gibt, welche Arten von Werten mit const in JavaScript festgelegt werden können - insbesondere mit Funktionen. Ist das gültig? Zugegeben, es funktioniert, aber wird es aus irgendeinem Grund als schlechte Praxis angesehen?

const doSomething = () => {
   ...
}

Sollen in ES6 alle Funktionen so definiert werden? Es scheint nicht so, als hätte sich das durchgesetzt.

Vielen Dank für alle Kommentare!

135
David Sinclair

Es gibt kein Problem damit, was Sie getan haben, aber Sie müssen sich den Unterschied zwischen Funktionsdeklarationen und Funktionsausdrücken merken.

Eine Funktionsdeklaration, das heißt:

function doSomething () {}

Wird ganz nach oben in den Geltungsbereich gezogen (und wie let und const sind sie auch blockspezifisch).

Dies bedeutet, dass Folgendes funktioniert:

doSomething() // works!
function doSomething() {}

Ein Funktionsausdruck, das heißt:

[const | let | var] = function () {} (or () =>

Ist die Erstellung einer anonymen Funktion (function () {}) und die Erstellung einer Variablen und dann die Zuordnung dieser anonymen Funktion zu dieser Variablen.

Daher werden die üblichen Regeln zum Verschieben von Variablen innerhalb eines Bereichs - blockspezifische Variablen (let und const) nicht als undefined an den oberen Rand ihres Blockbereichs verschoben.

Das heisst:

if (true) {
    doSomething() // will fail
    const doSomething = function () {}
}

Schlägt fehl, da doSomething nicht definiert ist. (Es wird ein ReferenceError werfen)

Wenn Sie zur Verwendung von var wechseln, wird die Variable zwar hochgezogen, aber mit undefined initialisiert, sodass der obige Codeblock immer noch nicht funktioniert. (Dies wirft ein TypeError, da doSomething zum Zeitpunkt des Aufrufs keine Funktion ist.)

Nach den üblichen Vorgehensweisen sollten Sie immer das richtige Werkzeug für den Job verwenden.

Axel Rauschmayer hat einen großartigen Beitrag zu Umfang und Umfang, einschließlich der es6-Semantik: Variablen und Umfang in ES6

189
tkone

Die Verwendung von const zum Definieren von Funktionen scheint zwar ein Hack zu sein, bringt jedoch einige große Vorteile mit sich, die es (meiner Meinung nach) überlegen machen.

  1. Dadurch wird die Funktion unveränderlich, sodass Sie nicht befürchten müssen, dass diese Funktion durch einen anderen Code geändert wird.

  2. Sie können die Fat Arrow-Syntax verwenden, die kürzer und sauberer ist.

  3. Die Verwendung von Pfeilfunktionen erledigt die Bindung von this für Sie.

beispiel mit function

// define a function
function add(x, y) { return x + y; }

// use it
console.log(add(1, 2)); // 3

// oops, someone mutated your function
add = function (x, y) { return x - y; };

// now this is not what you expected
console.log(add(1, 2)); // -1

gleiches Beispiel mit const

// define a function (wow! that is 8 chars shorter)
const add = (x, y) => x + y;

// use it
console.log(add(1, 2)); // 3

// someone tries to mutate the function
add = (x, y) => x - y; // Uncaught TypeError: Assignment to constant variable.
// the intruder fails and your function remains unchanged
71
Gaafar

Es ist drei Jahre her, seit diese Frage gestellt wurde, aber ich bin gerade dabei, darauf zu stoßen. Da diese Antwort so weit unten im Stapel liegt, gestatten Sie mir bitte, sie zu wiederholen:

F: Es interessiert mich, ob es Beschränkungen gibt, welche Arten von Werten mit const in JavaScript festgelegt werden können - insbesondere für Funktionen. Ist das gültig? Zugegeben, es funktioniert, aber wird es aus irgendeinem Grund als schlechte Praxis angesehen?

Ich war motiviert, etwas nachzuforschen, nachdem ich einen produktiven JavaScript-Codierer beobachtet hatte, der alwaysconst als Anweisung für functions verwendet, auch wenn es keinen offensichtlichen Grund/Nutzen gibt.

Als Antwort auf " wird es aus irgendeinem Grund als schlechte Praxis angesehen?" lassen Sie mich sagen, IMO, ja, oder zumindest gibt es Vorteile mit function Anweisung.

Es scheint mir, dass dies größtenteils eine Frage der Präferenz und des Stils ist. Es gibt oben einige gute Argumente, aber keines ist so klar wie in diesem Artikel:

Ständige Verwirrung: warum ich immer noch JavaScript-Funktionsanweisungen von medium.freecodecamp verwende. org/Bill Sourour, JavaScript-Guru, Berater und Lehrer.

Ich fordere alle auf, diesen Artikel zu lesen, auch wenn Sie bereits eine Entscheidung getroffen haben.

Hier sind die wichtigsten Punkte:

Funktionsanweisungen haben zwei klare Vorteile gegenüber [const] -Funktionsausdrücken:

Vorteil 1: Klarheit der Absicht

Wenn Sie täglich Tausende von Codezeilen scannen, ist es hilfreich, die Absicht des Programmierers so schnell und einfach wie möglich herauszufinden.

Vorteil Nr. 2: Reihenfolge der Deklaration == Reihenfolge der Ausführung

Idealerweise möchte ich meinen Code mehr oder weniger in der erwarteten Reihenfolge deklarieren, in der er ausgeführt wird.

Dies ist der Showstopper für mich: Jeder mit dem Schlüsselwort const deklarierte Wert ist unzugänglich, bis die Ausführung ihn erreicht.

Was ich oben beschrieben habe, zwingt uns, Code zu schreiben, der verkehrt herum aussieht. Wir müssen mit der niedrigsten Funktion beginnen und uns hocharbeiten.

Mein Gehirn funktioniert nicht so. Ich möchte den Kontext vor den Details.

Der meiste Code wird von Menschen geschrieben. Daher ist es sinnvoll, dass die Reihenfolge des Verstehens der meisten Leute ungefähr der Ausführungsreihenfolge des Codes folgt.

15
JMichaelTX

Es gibt einige sehr wichtige Vorteile bei der Verwendung von const und einige würden sagen, dass es verwendet werden sollte, wo immer dies möglich ist, da es absichtlich und indikativ ist.

Soweit ich das beurteilen kann, ist dies die aussagekräftigste und vorhersagbarste Deklaration von Variablen in JavaScript und eine der nützlichsten, WEIL es Einschränkungen gibt. Warum? Weil dadurch einige Möglichkeiten für var- und let-Deklarationen entfallen.

Woraus können Sie schließen, wenn Sie ein const lesen? Sie kennen alles Folgende, indem Sie die const -Deklarationsanweisung lesen UND nicht nach anderen Verweisen auf diese Variable suchen:

  • der Wert ist an diese Variable gebunden (obwohl das zugrunde liegende Objekt nicht tief unveränderlich ist).
  • es kann nicht außerhalb des unmittelbar enthaltenen Blocks zugegriffen werden
  • aufgrund der TDZ-Regeln (Temporal Dead Zone) wird auf die Bindung vor der Deklaration nie zugegriffen.

Das folgende Zitat stammt aus ein Artikel und argumentiert mit den Vorteilen von let und const. Außerdem wird Ihre Frage zu den Einschränkungen/Grenzen des Keywords direkter beantwortet:

Einschränkungen wie die von let und const bieten eine leistungsstarke Möglichkeit, Code verständlicher zu machen. Versuchen Sie, in dem von Ihnen geschriebenen Code so viele dieser Einschränkungen wie möglich zu berücksichtigen. Je mehr deklarative Einschränkungen die Bedeutung eines Codeteils einschränken, desto einfacher und schneller können Menschen in Zukunft einen Codeteil lesen, analysieren und verstehen.

Zugegeben, es gibt mehr Regeln für eine const -Deklaration als für eine var -Deklaration: Block-Scoped, TDZ, Assign at-Deklaration, keine Neuzuweisung. Während var Anweisungen nur das Scoping von Funktionen signalisieren. Das Zählen von Regeln bietet jedoch nicht viel Einsicht. Es ist besser, diese Regeln in Bezug auf die Komplexität abzuwägen: Addiert oder subtrahiert die Regel die Komplexität? Im Fall von const bedeutet Block-Scoping einen engeren Gültigkeitsbereich als Funktions-Scoping, TDZ bedeutet, dass wir den Gültigkeitsbereich nicht rückwärts von der Deklaration aus scannen müssen, um die Verwendung vor der Deklaration zu erkennen, und Zuweisungsregeln bedeuten dies Die Bindung behält immer die gleiche Referenz bei.

Je eingeschränkter Anweisungen sind, desto einfacher wird ein Codeabschnitt. Wenn wir Einschränkungen hinzufügen, was eine Anweisung bedeuten könnte, wird Code weniger unvorhersehbar. Dies ist einer der Hauptgründe, warum statisch getippte Programme im Allgemeinen besser lesbar sind als dynamisch getippte. Die statische Eingabe stellt eine große Einschränkung für den Programmersteller dar, stellt jedoch auch eine große Einschränkung für die Interpretation des Programms dar, sodass der Code leichter zu verstehen ist.

Unter Berücksichtigung dieser Argumente wird empfohlen, const zu verwenden, da dies die Anweisung ist, über die wir am wenigsten nachdenken können.

Quelle: https://ponyfoo.com/articles/var-let-const

6
mrmaclean89