Étant donné un fichier d'entrée comme
import { a } from 'b';
function x () {
a()
}
babel le compilera pour
'use strict';
var _b = require('b');
function x() {
(0, _b.a)();
}
mais une fois compilé en mode lâche, l'appel de fonction est émis comme _b.a();
J'ai fait des recherches pour savoir où l'opérateur virgule est ajouté dans l'espoir qu'un commentaire l'explique. Le code chargé de l'ajouter est ici .
javascript
ecmascript-6
babeljs
Will Smith
la source
la source
_b.a.call()
pour que l'intention soit claire.Réponses:
(0, _b.a)()
garantit que la fonction_b.a
est appelée avecthis
set sur l'objet global (ou si le mode strict est activé, surundefined
). Si vous appelez_b.a()
directement, alors_b.a
est appelé avecthis
la valeur_b
.(0, _b.a)();
est équivalent à(il
,
s'agit de l'opérateur virgule, voir https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator ).la source
var _a = (0, _b.a)
en haut du fichier puis l'appel_a
permettrait d'économiser plus d'espace dans de nombreux cas, aucune idée qu'ils n'ont fait cela?_b.a
est un getter (dynamique).this === undefined
et vous n'avez même pas besoin de mentionner l'objet globalAlors, voyons un exemple:
Maintenant, dans la
foo
méthode,this
est égal àa
(carfoo
est attaché àa
). Donc, si vous appeleza.foo(
) directement, il se connecterafalse
à la console.Mais, si vous étiez appelé
(0, a.foo)()
. L'expression(0, a.foo)
évaluera chacun de ses opérandes (de gauche à droite) et retournera la valeur du dernier opérande. En d'autres termes,(0, a.foo)
équivaut àPuisque cette fonction n'est plus attachée à rien,
this
c'est l'objet globalwindow
. C'est pourquoi il se connectetrue
à la console lors de l'appel(0, a.foo)()
.la source
console.log(this === window);
dans la console de développement ne consigne plus l'impression.