Por que qualquer código JavaScript deseja "cortar a ligação"?

10

O motivo de usar um

(0, foo.fn)();

é cortar a ligação : a thisnão será mais vinculada a, foomas será vinculada ao objeto global.

Mas qual é a razão pela qual qualquer código JavaScript (ou código JS do Google) gostaria de cortar a ligação? (e é um anti-padrão ou não?)

falta de polaridade
fonte
chamá-lo de vinculação não parece certo. bindmétodo vincula. Aqui é apenas uma mudança de contexto. Você não pode cortar ou perder a encadernação (o vínculo criado por bind).
Marzelin #
talvez esse código seja gerado por um transpiler de alguma linguagem funcional (clojurescript?) que tenha requisitos específicos quando se trata de chamar funções?
marzelin
possível duplicação de Por que babel reescreve a chamada de função importada para (0, fn) (…)? - ou onde mais você está vendo isso?
Bergi 01/12/19
Eu acho que vi isso no código do Google e, possivelmente, em algum framework como Angular, Reagir, ou alguns outros ... não me lembro onde e às vezes é minified
nonopolarity

Respostas:

8

Esse tipo de código geralmente é gerado por transpilers (como Babel), a fim de converter o JavaScript moderno - que usa as adições mais recentes à especificação - em uma versão JavaScript com suporte mais amplo.

Aqui está um exemplo em que esse padrão de transpilação ocorre:

Digamos que tenhamos esse código original antes da transpilação:

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

Para criar esse código compatível com ES5, você pode fazer o seguinte:

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

Mas aqui nós executaríamos myfunccom mymoduleo thisvalor, o que não está acontecendo no código original. E, embora isso nem sempre seja um problema, é melhor garantir que a função se comporte da mesma forma que na versão original , mesmo que essa função use uma thisreferência - quão incomum ou mesmo inútil esse uso de thisin myfuncpode ser ( porque também na versão original seria undefined).

Por exemplo, se o código original this.memberFun()gerar um erro devido a uma referência na função, ele também lançará a versão transpilada.

Portanto, o operador de vírgula é usado para se livrar dessa diferença:

(0, mymodule.myfunc)();

É verdade que, no código que você mesmo escreve, você nunca teria um bom caso de uso para esse padrão, pois não o usaria thisem myfuncprimeiro lugar.

trincot
fonte
Como está requirerelacionado ao ES6 ou ES5? Eu costumava pensar que exigir é um módulo de nó.
Conexo1
requireé de fato uma função disponível no nó ou fornecida em bibliotecas como browserify, require.js, ... etc. Não está especificamente relacionado ao ES5 / 6. Por outro lado, uma construção de linguagem ES6 + como importnão pode ser suportada para o ES5 sem algo como transpilação.
Trincot 01/12/19
portanto, se estiver condensando em várias linhas de um resumo: se for uma biblioteca ou módulo que inclui muitas funções que não são realmente métodos ou OO (na forma de modA.fn1), essas funções realmente não devem ser usadas, thismas por acidente eles fazem, nós não queremos a thisafetar o módulo de forma alguma como um efeito colateral, então vamos cortar a ligação, torná-lo se comportar como deve comportar-se se é uma função independente
nonopolarity
Sim, é assim que você poderia resumir. Novamente, isso é principalmente uma preocupação para transpilers, não tanto para codificadores.
Trincot 01/12/19