Der Grund für die Verwendung von a
(0, foo.fn)();
ist die Bindung zu schneiden : die this
wird nicht mehr foo
an das globale Objekt gebunden, sondern an das globale Objekt gebunden sein.
Aber was ist der Grund, warum ein JavaScript-Code (oder der JS-Code von Google) die Bindung abschneiden möchte? (Und ist es ein Anti-Muster oder nicht?)
javascript
Unpolarität
quelle
quelle
bind
Methode bindet. Hier ist es nur eine Kontextänderung. Sie können die Bindung nicht schneiden oder verlieren (die von erstellte Bindungbind
).Antworten:
Diese Art von Code wird normalerweise von Transpilern (wie Babel) generiert, um modernes JavaScript - das die neuesten Ergänzungen der Spezifikation verwendet - in eine JavaScript-Version zu konvertieren, die allgemeiner unterstützt wird.
Hier ist ein Beispiel, in dem dieses Transpilationsmuster auftritt:
Nehmen wir an, wir haben diesen Originalcode vor der Transpilation:
Um diesen ES5-kompatiblen Code zu erstellen, können Sie Folgendes tun:
Aber hier würden wir
myfunc
mitmymodule
alsthis
Wert ausführen , was im ursprünglichen Code nicht vorkommt. Und obwohl dies möglicherweise nicht immer ein Problem ist, ist es besser sicherzustellen, dass sich die Funktion genauso verhält wie in der Originalversion , selbst wenn diese Funktion einethis
Referenz verwenden würde - wie ungewöhnlich oder sogar nutzlos diese Verwendung vonthis
in seinmyfunc
könnte ( denn auch in der Originalversion wäre esundefined
).Wenn der ursprüngliche Code beispielsweise aufgrund eines
this.memberFun()
Verweises in der Funktion einen Fehler auslösen würde , wird auch die transpilierte Version ausgegeben.Hier wird also der Kommaoperator verwendet, um diesen Unterschied zu beseitigen:
Zugegeben, in Code, den Sie selbst schreiben, würden Sie nie einen guten Anwendungsfall für dieses Muster haben, da Sie nicht verwenden würden ,
this
inmyfunc
an erster Stelle.quelle
require
mit ES6 oder ES5 zusammen? Früher dachte ich, dass erfordern ein Knotenmodul ist.require
ist in der Tat eine Funktion, die im Knoten verfügbar ist oder in Bibliotheken wie browserify, require.js, ... usw. bereitgestellt wird. Es ist nicht speziell mit ES5 / 6 verwandt. Auf der anderen Seite kann ein ES6 + -Sprachenkonstrukt wieimport
ohne Transpilation nicht auf ES5 zurückportiert werden.modA.fn1
), sollten diese Funktionen wirklich nicht verwendet werden,this
sondern aus Versehenthis
Wenn dies der Fall ist, möchten wir nicht , dass das Modul in irgendeiner Weise als Nebeneffekt beeinflusst wird.