Pourquoi ce JavaScript fonctionne-t-il?

Je regardais la sortie de certaines choses de UglifyJS et je me suis avéré sur un code comme celui-ci:

var a = 0; var b = function () { return function () { a++; }(), 'Hello, World' }(); 

Après avoir exécuté ce code a est 1 et b est la chaîne Hello, World! .

Au premier coup d'œil, il apparaît que b sera undefined car il ressemble au résultat d'une fonction sans retour, la valeur est retournée, mais elle est suivie d'une virgule et d'un littéral de chaîne.

Pourquoi cela fonctionne-t-il?
Et pourquoi UglifyJS n'exécute-t-il que la fonction anonyme et retourne Hello, World! Comme la prochaine déclaration?

Cela fonctionne en raison de l'opérateur de virgule. À partir des spécifications MDN:

L'opérateur de coma évalue ses deux opérandes (de gauche à droite) et renvoie la valeur du second opérande.

Les deux fonctions sont IFFY, elles sont immédiatement exécutées.

Le résultat d'une expression utilisant l'opérateur de virgule est le côté droit de l'opérateur de virgule.

Tu as:

 return a_function_call(), a_string 

… donc vous obtenez une a_string attribuée.

Tout d'abord, permettez-moi de citer MDN sur l'opérateur de virgule :

L'opérateur de coma évalue ses deux opérandes (de gauche à droite) et renvoie la valeur du second opérande.

Cela étant dit, il est clair, comment votre code évalue:

Dans la fonction exécutée immédiatement, vous renvoyez 2 valeurs séparées par une virgule:

 function () { a++; }() 

et

 'Hello World' 

Donc, les deux opérandes sont évalués. Cela augmente votre variable a et conduit à l'expression suivante pour la valeur de retour de la fonction à créer b :

 undefined, 'Hello World' 

Enfin, l'opérande droit est renvoyé comme une valeur pour la fonction extérieure, ce qui donne b la valeur 'Hello World' .

Consultez l' opérateur de virgules en JavaScript .

L'opérateur de coma évalue ses deux opérandes (de gauche à droite) et renvoie la valeur du second opérande.