Pourquoi un code JavaScript veut-il «couper la liaison»?

10

La raison d'utiliser un

(0, foo.fn)();

est de couper la liaison : le thisne sera plus lié à foomais sera lié à l'objet global.

Mais quelle est la raison pour laquelle tout code JavaScript (ou le code JS de Google) voudrait couper la liaison? (et est-ce un anti-pattern ou non?)

non-polarité
la source
l'appeler une reliure ne me semble pas juste. bindla méthode se lie. Ici, c'est juste un changement de contexte. Vous ne pouvez pas couper ou perdre la liaison (le lien créé par bind).
marzelin
peut-être que ce code est généré par un transpilateur à partir d'un langage fonctionnel (clojurescript?) qui a des exigences spécifiques lorsqu'il s'agit d'appeler des fonctions?
marzelin
doublon possible de Pourquoi Babel réécrit-il l'appel de fonction importé à (0, fn) (…)? - ou ailleurs voyez-vous cela?
Bergi
Je pense que je l'ai vu dans le code de Google et peut-être dans un cadre comme Angular, React ou d'autres ... je ne me souviens pas où et parfois il est
minifié

Réponses:

8

Ce type de code est généralement généré par des transpilateurs (comme Babel), afin de convertir du JavaScript moderne - qui utilise les ajouts les plus récents à la spécification - en une version JavaScript plus largement prise en charge.

Voici un exemple où ce modèle de transpilation se produit:

Disons que nous avons ce code original avant la transpilation:

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

Pour créer ce code compatible ES5, vous pouvez procéder comme suit:

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

Mais ici, nous exécuterions myfuncavec mymodulecomme thisvaleur, ce qui ne se produit pas dans le code d'origine. Et bien que cela ne soit pas toujours un problème, il est préférable de s'assurer que la fonction se comporte exactement comme elle le ferait dans la version d'origine , même si cette fonction utiliserait une thisréférence - à quel point inhabituel ou même inutile cette utilisation de thisin myfuncpourrait être ( parce que ce serait aussi dans la version originale undefined).

Ainsi, par exemple, si le code d'origine génère une erreur en raison d'une this.memberFun()référence dans la fonction, il renvoie également la version transpilée.

Donc, c'est là que l'opérateur virgule est utilisé pour se débarrasser de cette différence:

(0, mymodule.myfunc)();

Certes, dans le code que vous écrivez vous - même, vous auriez jamais un bon cas d' utilisation pour ce modèle, comme vous ne l' utiliser thisdans myfuncen premier lieu.

trincot
la source
Quel est le requirelien avec ES6 ou ES5? Je pensais que require est un module de nœud.
connexo
requireest en effet une fonction disponible en nœud ou bien fournie dans des bibliothèques comme browserify, require.js, ... etc. Il n'est pas spécifiquement lié à ES5 / 6. D'un autre côté, une construction de langage comme ES6 + importne peut pas être rétroportée vers ES5 sans quelque chose comme la transpilation.
trincot
donc si le condenser sur plusieurs lignes d'un résumé: s'il s'agit d'une bibliothèque ou d'un module qui comprend beaucoup de fonctions qui ne sont pas vraiment des méthodes ou des OO, (sous la forme de modA.fn1), alors ces fonctions ne devraient vraiment pas être utilisées thismais si par accident ils le font, nous ne voulons pas que le thismodule affecte le module de quelque manière que ce soit comme effet secondaire, alors nous coupons la liaison, le faisons se comporter comme il devrait se comporter s'il s'agit d'une fonction indépendante
nonopolarité
Oui, c'est bien ainsi que vous pourriez le résumer. Encore une fois, c'est surtout une préoccupation pour les transpilateurs, pas tellement un codeur.
trincot