Perché un codice JavaScript vuole "tagliare l'associazione"?


10

Il motivo dell'utilizzo di a

(0, foo.fn)();

è tagliare l'associazione : thisnon sarà più associato fooma sarà associato all'oggetto globale.

Ma qual è il motivo per cui qualsiasi codice JavaScript (o codice JS di Google) vorrebbe tagliare l'associazione? (ed è un anti-pattern o no?)


chiamarlo un legame non sembra giusto. bindil metodo si lega. Qui è solo un cambio di contesto. Non puoi tagliare o perdere il legame (il legame creato da bind).
marzelin,

forse questo codice è generato da un transpiler da un linguaggio funzionale (clojurescript?) che ha requisiti specifici quando si tratta di chiamare funzioni?
marzelin,


Penso di averlo visto nel codice di Google e possibilmente in un framework come Angular, React o altri ... non ricordo dove e talvolta è minimizzato
polarità

Risposte:


8

Questo tipo di codice viene in genere generato dai transpiler (come Babel), al fine di convertire i moderni JavaScript - che utilizzano le aggiunte più recenti alle specifiche - in una versione JavaScript maggiormente supportata.

Ecco un esempio in cui si verifica questo modello di transpilazione:

Diciamo che abbiamo questo codice originale prima della transpilation:

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

Per rendere questo codice compatibile ES5, è possibile effettuare ciò:

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

Ma qui vorremmo eseguire myfunccon mymodulecome thisvalore, che non sta accadendo nel codice originale. E anche se questo potrebbe non essere sempre un problema, è meglio assicurarsi che la funzione si comporti esattamente come nella versione originale , anche se quella funzione userebbe un thisriferimento - quanto potrebbe essere insolito o addirittura inutile l'uso di thisin myfunc( perché anche nella versione originale sarebbe undefined).

Quindi, ad esempio, se il codice originale this.memberFun()generasse un errore a causa di un riferimento nella funzione, verrà anche lanciato nella versione traspilata.

Quindi è dove l'operatore virgola viene utilizzato per sbarazzarsi di quella differenza:

(0, mymodule.myfunc)();

Certo, nel codice che scrivi tu stesso, non avresti mai un buon caso d'uso per questo modello, poiché non lo utilizzeresti thisin myfuncprimo luogo.


In che modo è requirecorrelato a ES6 o ES5? Pensavo che richiedere fosse un modulo nodo.
connexo,

requireè effettivamente una funzione disponibile nel nodo oppure fornita in librerie come browserify, request.js, ... ecc. Non è specificamente correlato a ES5 / 6. D'altra parte, un costrutto del linguaggio ES6 + come importnon può essere riportato in ES5 senza qualcosa come transpilation.
trincot

quindi se lo condensi su più righe di un sommario: se si tratta di una libreria o di un modulo che include molte funzioni che non sono realmente metodi o OO (sotto forma di modA.fn1), allora queste funzioni non dovrebbero realmente essere utilizzate, thisma se per caso lo fanno, non vogliamo thische influisca in alcun modo sul modulo come effetto collaterale, quindi tagliamo il legame, lo facciamo comportare come dovrebbe comportarsi se si tratta di una funzione indipendente
polarità

Sì, è proprio così che potresti riassumerlo. Ancora una volta, questo è principalmente un problema per i transpilers, non tanto per un programmatore.
trincot
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.