2017-04-26 2 views
1

Il existe une règle d'insertion de point-virgule automatique dans ECMAScript et AFAIR. Elle indique que le point-virgule est inséré s'il est possible (pas d'erreur de syntaxe) de l'insérer à la fin de la ligne.Pourquoi la règle ASI ignore-t-elle le retour à la ligne dans la fonction de flèche?

est ici un Y-combinator, écrit avec l'aide d'une fonction de flèche:

var Y = (F) => 
    (x => F(y => x(x)(y))) 
    (x => F(y => x(x)(y))) 

Ce serait une erreur de syntaxe pour insérer ; à la fin de la première ligne, mais il travaille pour la deuxième (et le troisième, mais ça n'a pas d'importance). Ainsi, l'expression doit être analysée comme:

var Y = (F) => 
    (x => F(y => x(x)(y))); 
    (x => F(y => x(x)(y))); 

Mais code avec le ; font explicitement la 2ème ligne fonctionne différemment pour vous, donc il n'y a pas de règle ASI. Question: Pourquoi aucun point-virgule n'est inséré?

+0

"* le point-virgule est inséré si c'est possible *" - non. C'est * est inséré quand ** nécessaire ** pour éviter une erreur de syntaxe * – Bergi

+1

Aussi 'const Y = f => x => f (Y (f)) (x)' – naomik

Répondre

1

La règle est un peu plus subtile que insert ";" if it can. Les règles précises sont spécifiées dans la section 7.9.1 partie 1:

Quand le programme est analysé de gauche à droite, un jeton (appelé le jeton incriminé ) est rencontré non autorisé par une production de la grammaire, puis un point-virgule est automatiquement inséré avant le jeton incriminé si une ou plusieurs des conditions suivantes est remplie:

  1. le jeton incriminé est séparé du jeton précédent par au moins une LineTerminator.

  2. Le jeton incriminé est}.

Ainsi, il n'insère pas à un saut de ligne si possible. Au lieu de cela, il analyse le code jusqu'à ce qu'il y ait un "jeton offensant". Ensuite, il revient en arrière d'un octet et voit s'il y a une nouvelle ligne. S'il y en a, il insérera un point-virgule.

Personnellement, ce n'est pas une règle facile pour mon cerveau de s'y habituer, donc je préfère ajouter des points-virgules moi-même.

+1

La section droite pour ES6 est [11.9.1 ] (http://www.ecma-international.org/ecma-262/6.0/#sec-rules-of-automatic-semicolon-insertion) – n00dl3