2015-10-09 13 views
60

Ich bin interessiert, wenn es irgendwelche Grenzen gibt, welche Arten von Werten unter Verwendung von const in JavaScript-in bestimmten Funktionen gesetzt werden können. Ist das gültig? Zugegeben, es funktioniert, aber wird es aus irgendeinem Grund als schlecht angesehen?Korrekte Verwendung von const zum Definieren von Funktionen in JavaScript

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

Sollen alle Funktionen auf diese Weise in ES6 definiert werden? Es scheint nicht so zu sein, dass sich das durchgesetzt hat.

Vielen Dank für Kommentare!

+0

Sie scheinen mehrere zu fragen Fragen: 1) * "Ich bin interessiert, wenn es irgendwelche Grenzen gibt, welche Arten von Werten mit const in JavaScript gesetzt werden können" * Nr. 2) * "Ist das gültig?" * Ja. 3) * "ist es schlecht Übung aus irgendeinem Grund "* Ich denke, es war nicht lange genug, um etwas darüber zu sagen, aber ich sehe nicht, warum dies Pad Praxis sein sollte. Es ist nicht viel anders als' var doSomething = ; ' 4) * "Sollen alle Funktionen in ES6 so definiert werden? ? "Scheint mir umständlich. Ich mag Funktionserklärungen. Jeder für sich. –

+1

So wie ich es sehe (Meinung, keine Tatsache), macht es Sinn, wenn man Funktionen neu definieren will. Ob es gesund ist oder ob es einen funktionalen Nutzen hat - das ist fraglich. Wenn Sie denken, dass es zu Ihrem Nutzungsszenario passt, glaube ich nicht, dass jemand Ihre Entscheidung widerlegen kann und es für eine schlechte Praxis hält. – Mjh

+2

Ich denke, die Frage ist, was Sie mit "const" erreichen wollen. Möchten Sie verhindern, dass die Funktion außer Kraft gesetzt wird? Ich nehme an, Sie kennen Ihren Code, um das nicht zu tun. Möchten Sie die Absicht von "etwas tun" ausdrücken, d. H. Dass es eine Funktion hält und seinen Wert nicht ändert? Ich denke, dass Funktionsdeklarationen diese Absicht klar kommunizieren. Also, wenn Sie "Laufzeitschutz" aus dem Overriding benötigen, gehen Sie dafür. Ansonsten sehe ich keinen großen Nutzen. Wenn Sie 'var foo = function() {};' verwenden, würde ich natürlich 'const' anstelle von' var' verwenden. –

Antwort

82

Es gibt kein Problem mit dem, was Sie getan haben, aber Sie müssen sich an den Unterschied zwischen Funktionsdeklarationen und Funktionsausdrücken erinnern.

A Funktionsdeklaration, das heißt:

function doSomething() {} 

wird vollständig auf den oberen Rand des Umfangs gehoben (und wie let und const sie Block scoped sind als auch).

Dies bedeutet, dass die folgenden Arbeits wird:

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

ein Funktionsausdruck, das heißt:

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

die Schaffung einer anonymen Funktion ist (function() {}) und die Schaffung einer Variablen, und dann die Zuweisung dieser anonymen Funktion zu dieser Variablen.

So sind die üblichen Regeln um variable Hebe innerhalb eines Bereichs - Block-scoped Variablen (let und const) Sie hissen nicht als undefined an der Spitze ihres Block Umfang.

Das bedeutet:

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

fehl, da doSomething nicht definiert ist.

(Es wird ein ReferenceError werfen) Wenn Sie wechseln var zu verwenden Sie Ihre Hissen des Variable zu bekommen, aber es wird zu undefined initialisiert werden, so dass Codeblock oben funktioniert immer noch nicht. (Dies wird eine TypeError werfen, da doSomething keine Funktion zum Zeitpunkt ist, an dem Sie es nennen)

Soweit Standardpraktiken gehen, sollten Sie immer das richtige Werkzeug für den Job verwenden.

Axel Rauschmayer hat einen großen Beitrag am Umfang und Hebe einschließlich es6 Semantik: Variables and Scoping in ES6

+0

Möchte nur hinzufügen, dass es6 Klassen const intern verwendet, um den Klassennamen davor zu schützen, innerhalb der Klasse neu zugewiesen zu werden. – user2342460

-1

Es ist ziemlich hässlich, es auf diese Weise zu tun, aber es ist sicherlich gültig.

Wo ich arbeite Ich entwarf eine einfache Factory-Klasse, die ein parent Objekt und ein Array von Funktionen, und dann stellt diese Funktionen auf die Eltern durch Getter mit defineProperty.

Es hat den gleichen Effekt: eine Funktion kann nicht geändert werden, nachdem sie definiert wurde, aber es sieht meiner Meinung nach viel sauberer aus.

Das Wichtigste ist, in Ihrem Projekt konsistent zu sein. Sammeln Sie Ihre Teammitglieder und treffen Sie klare Vereinbarungen darüber, wie Sie dies tun werden.

+1

Leicht außerthematisch: Ich wäre nicht überrascht, in Zukunft "const function name() {}" zu sehen, um JS mit anderen Sprachen zu optimieren. –

+4

"Es ist ziemlich hässlich, es so zu machen". Diese Syntax gewinnt tatsächlich an Bedeutung. Siehe beispielsweise https://github.com/reactjs/redux/tree/master/examples/todos. – Izhaki

+0

Ja, ich mache es jetzt auch auf diese Weise, um das Zielfernrohr zu "pinnen", denke ich, es ist nur gewöhnungsbedürftig. –

-2

Stephan Bijzitter sagt
© Es ziemlich hässlich ist, es zu tun auf diese Weise

const foo = (a, _foo, b) => _foo(a, a, b) 
 
const bar = (a, b, c) => (c - 1) ? bar((a * b), b, (c - 1)) : a 
 

 
alert(
 
    foo(3, bar, 4) 
 
)

wirklich?

34

Obwohl const mit Funktionen zu definieren scheint wie ein Hack, aber es kommt mit einigen großen Vorteile, die es überlegen (meiner Meinung nach) machen

  1. es die Funktion unveränderlich macht, so dass Sie nicht tun muss sich darum sorgen, dass diese Funktion von einem anderen Code geändert wird.

  2. Sie können die Fettpfeilsyntax verwenden, die kürzer ist & Reiniger.

  3. Pfeil mit Hilfe von Funktionen übernimmt this für Sie bindend.

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

gleichem 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

+0

Und Sie können Funktion add (x, y) zweimal deklarieren, aber Sie können nicht zweimal deklarieren const add = ... – TatianaP

+0

1. Unveränderlichkeit ist ein echter Vorteil, aber es ist sehr selten, dass jemand eine Funktion tatsächlich überschreibt. 2. Die Fettpfeilsyntax ist nicht kürzer, es sei denn, Ihre Funktion kann ein Ausdruck sein. 'Funktion f (x, y) {' ist 18 Zeichen, const f = (x, y) => {'ist 21 Zeichen, also 3 Zeichen länger. 3. Das Halten dieser Bindung ist nur dann von Bedeutung, wenn die Funktionen innerhalb einer Methode definiert sind (oder einer anderen Funktion, die diese Bedeutung hat). Im Skript der obersten Ebene ist es sinnlos. Ich sage nicht, dass Sie falsch liegen, nur dass die Gründe, die Sie erwähnen, nicht sehr relevant sind. – Nakedible

0

Es gibt ein anderes Szenario, in dem eine konstante Funktion nützlich sein könnte. Wenn Sie viele Konstanten in Ihrem Code und eine Funktion benötigen, die speziell auf diesen Konstanten arbeiten, könnte es eine gute Idee sein, um diese Funktion in eine Konstante selbst zu drehen:

const FLAG_ONE = 1; 
const FLAG_TWO = 2; 
const FLAG_THREE = 4; 
// etc. 

// resolves flag into string for debugging purposes: 
const FLAG_NAME = flag => { 
    switch (flag) { 
     case FLAG_ONE: return 'one'; 
     // etc. 
    } 
}; 

Es ist nicht notwendig in irgendeiner Weise Definieren von FLAG_NAME als Konstante, verbessert jedoch die Lesbarkeit Ihres Codes.

3

Es gibt einige sehr wichtige Vorteile für die Verwendung von const und einige würden sagen, es sollte wegen soweit wie möglich verwendet werden, wie bewusste und indikativ ist.

Es ist, soweit ich das beurteilen kann, die indikativste und vorhersagbarste Deklaration von Variablen in Javascript und eine der nützlichsten, WEIL es so eingeschränkt ist. Warum? Weil dadurch einige Möglichkeiten für var- und let-Deklarationen entfallen.

Was können Sie ableiten, wenn Sie ein 'const' lesen? Sie kennen alle folgenden Punkte, indem Sie einfach die Anweisung const deklaration AND lesen, ohne nach anderen Verweisen auf diese Variable zu suchen: der Wert ist an diese Variable gebunden (obwohl das zugrunde liegende Objekt nicht tief unveränderlich ist); auf es kann nicht außerhalb seines unmittelbar enthaltenen Blocks zugegriffen werden; und auf die Bindung wird vor der Deklaration aufgrund zeitlicher Dead Zone-Regeln (TDZ) nie zugegriffen.

Aus einem Artikel argumentiert die Vorteile von let und const, und es auch direkt beantwortet Ihre Frage über die Einschränkungen/Grenzen des Keywords:

„Constraints wie die von lassen und konst angeboten werden, eine leistungsfähige Methode zur Herstellung von Code einfacher zu verstehen Versuchen Sie, so viele dieser Einschränkungen wie möglich in den Code, den Sie schreiben, zu sammeln.Je mehr deklarative Einschränkungen, die begrenzen, was ein Stück Code bedeuten könnte, desto einfacher und schneller ist es für Menschen zu lesen, zu analysieren und zu verstehen ein Stück Code in der Zukunft

Zugegeben, es gibt mehr Regeln für eine const-Deklaration als für eine var-Deklaration: block-scoped, TDZ, assign at declaration, no re Zuordnung. Während var-Anweisungen nur Funktion Scoping signalisieren. Regelzählung bietet jedoch wenig Einblick. Es ist besser, diese Regeln in Bezug auf die Komplexität abzuwägen: Fügt die Regel Komplexität hinzu oder subtrahiert sie? Im Fall von const bedeutet Block Scoping einen engeren Bereich als Funktionsumfang, TDZ bedeutet, dass wir den Bereich nicht rückwärts von der Deklaration scannen müssen, um die Verwendung vor der Deklaration zu erkennen, und die Zuweisungsregeln bedeuten, dass die Bindung immer erhalten bleibt die gleiche Referenz.

Je eingeschränkter Aussagen sind, desto einfacher wird ein Stück Code. Wenn wir Einschränkungen hinzufügen, was eine Aussage bedeuten könnte, wird Code weniger unberechenbar. Dies ist einer der Hauptgründe, warum statisch typisierte Programme in der Regel einfacher zu lesen sind als dynamisch typisierte. Statische Typisierung stellt eine große Einschränkung für den Programmschreiber dar, aber es stellt auch eine große Einschränkung dar, wie das Programm interpretiert werden kann, wodurch sein Code leichter verständlich wird.

Mit diesen Argumenten im Sinn, ist es empfehlenswert, dass Sie const, wo möglich verwenden, da es die Aussage ist, dass uns die wenigsten Möglichkeiten gibt, um darüber nachzudenken“

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

Verwandte Themen