La raison d'utiliser un
(0, foo.fn)();
est de couper la liaison : le this
ne sera plus lié à foo
mais 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?)
javascript
non-polarité
la source
la source
bind
la méthode se lie. Ici, c'est juste un changement de contexte. Vous ne pouvez pas couper ou perdre la liaison (le lien créé parbind
).Réponses:
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:
Pour créer ce code compatible ES5, vous pouvez procéder comme suit:
Mais ici, nous exécuterions
myfunc
avecmymodule
commethis
valeur, 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 unethis
référence - à quel point inhabituel ou même inutile cette utilisation dethis
inmyfunc
pourrait être ( parce que ce serait aussi dans la version originaleundefined
).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:
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
this
dansmyfunc
en premier lieu.la source
require
lien avec ES6 ou ES5? Je pensais que require est un module de nœud.require
est 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 +import
ne peut pas être rétroportée vers ES5 sans quelque chose comme la transpilation.modA.fn1
), alors ces fonctions ne devraient vraiment pas être utiliséesthis
mais si par accident ils le font, nous ne voulons pas que lethis
module 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