Warum möchte ein JavaScript-Code die Bindung abschneiden?

10

Der Grund für die Verwendung von a

(0, foo.fn)();

ist die Bindung zu schneiden : die thiswird nicht mehr fooan 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?)

Unpolarität
quelle
es eine Bindung zu nennen , fühlt sich nicht richtig an. bindMethode bindet. Hier ist es nur eine Kontextänderung. Sie können die Bindung nicht schneiden oder verlieren (die von erstellte Bindung bind).
Marzelin
Vielleicht wird dieser Code von einem Transpiler aus einer funktionalen Sprache (Clojurescript?) generiert, die spezielle Anforderungen an das Aufrufen von Funktionen stellt.
Marzelin
Mögliches Duplikat von Warum schreibt babel den importierten Funktionsaufruf auf (0, fn) (…) um? - oder wo sonst siehst du das?
Bergi
Ich glaube, ich habe es in Googles Code gesehen und möglicherweise in einem Framework wie Angular, React oder einem anderen ... kann mich nicht erinnern, wo und manchmal wird es minimiert
Unpolarität

Antworten:

8

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:

import {myfunc} from "mymodule";
myfunc();

Um diesen ES5-kompatiblen Code zu erstellen, können Sie Folgendes tun:

"use strict";    
var mymodule = require("mymodule");    
mymodule.myfunc();

Aber hier würden wir myfuncmit mymoduleals thisWert 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 eine thisReferenz verwenden würde - wie ungewöhnlich oder sogar nutzlos diese Verwendung von thisin sein myfunckönnte ( denn auch in der Originalversion wäre es undefined).

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:

(0, mymodule.myfunc)();

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 , thisin myfuncan erster Stelle.

Trincot
quelle
Wie hängt es requiremit ES6 oder ES5 zusammen? Früher dachte ich, dass erfordern ein Knotenmodul ist.
Connexo
requireist 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 wie importohne Transpilation nicht auf ES5 zurückportiert werden.
Trincot
Wenn Sie es also auf mehrere Zeilen einer Zusammenfassung komprimieren: Wenn es sich um eine Bibliothek oder ein Modul handelt, das viele Funktionen enthält, die nicht wirklich Methoden oder OO sind (in Form von modA.fn1), sollten diese Funktionen wirklich nicht verwendet werden, thissondern aus Versehen thisWenn dies der Fall ist, möchten wir nicht , dass das Modul in irgendeiner Weise als Nebeneffekt beeinflusst wird.
Deshalb
Ja, so könnte man es zusammenfassen. Auch dies ist meistens ein Problem für Transpiler, nicht so sehr für einen Codierer.
Trincot