Aujourd'hui, alors que je lisais au hasard le livre O'Reilly sur les modèles JavaScript, j'ai trouvé une chose intéressante (page 27 pour référence).
En Javascript, dans certains cas, il y a une différence si l'emplacement de départ de l'accolade est différent.
function test_function1() {
return
{
name: 'rajat'
};
}
var obj = test_function1();
alert(obj); //Shows "undefined"
Tandis que
function test_function2() {
return {
name: 'rajat'
};
}
var obj = test_function2();
alert(obj); //Shows object
Y a-t-il un autre langage qui ait un tel comportement? Si tel est le cas, je devrais certainement changer d’habitude .. :)
Je suis principalement préoccupé par PHP, C, C ++, Java et ruby.
javascript
language-agnostic
programming-languages
language-design
Rajat Singhal
la source
la source
Réponses:
Tout langage qui ne repose pas sur des points-virgules (mais plutôt sur des nouvelles lignes) pour délimiter des instructions le permet potentiellement. Considérez Python :
Vous pourrez peut-être créer un cas similaire dans Visual Basic, mais je ne peux pas comprendre comment, car VB est assez restrictif dans l'emplacement des valeurs. Mais ce qui suit devrait fonctionner, sauf si l'analyseur statique se plaint d'un code inaccessible:
Parmi les langues que vous avez mentionnées, Ruby a la même propriété. PHP, C, C ++ et Java ne le font pas simplement parce qu'ils rejettent le retour à la ligne en tant qu'espace blanc et nécessitent des points-virgules pour délimiter les instructions.
Voici le code équivalent de l'exemple Python dans Ruby:
la source
Throw
et ceex.GetBaseException()
sont des lignes logiques séparées. Plus spécifiquement, étant donné que Basic utilise historiquement des lignes pour délimiter ses déclarations, un "gotcha" serait plus probablement une situation où un programmeur pense qu'il a créé une nouvelle instruction sur une nouvelle ligne logique, mais ne l'a pas fait.L'interpréteur JavaScript ajoute automatiquement un
;
à la fin de chaque ligne s'il n'en trouve pas (à quelques exceptions près, sans y entrer ici :).Donc, fondamentalement, le problème n'est pas l'emplacement des accolades (qui représentent ici un objet littéral, pas un bloc de code comme dans la plupart des langages), mais cette petite "fonctionnalité" qui oblige votre premier exemple à
return ;
=>undefined
. Vous pouvez vérifier le comportement dereturn
dans la spécification ES5 .Pour d'autres langues qui ont un comportement similaire, consultez la réponse de Konrad .
la source
undefined
à être retourné. J'ai écrit un article sur les autres langues préfixées par afaik , alors prenez-le avec un grain de sel :).Certainement. Le langage de programmation go de Google présente un comportement très similaire (bien qu'avec des effets différents). Comme expliqué ici:
Secrètement, je pense que Rob Pike voulait juste une excuse pour exiger le style One True Brace.
la source
La réponse à cette question est assez simple. Toute langue qui a «l'insertion automatique de point-virgule» peut être en difficulté sur cette ligne. Le problème avec ça
..est que le moteur js insérera un point-virgule après l'
return;
instruction (et donc retourneraundefined
). Cet exemple est une bonne raison d'ouvrir les accolades toujours du côté droit et jamais du côté gauche également. Comme vous l'avez déjà correctement remarqué, s'il y a un crochet dans la même ligne, l'interprétateur le remarquera et ne pourra pas insérer un point-virgule.la source
FWIW, JSLint signale plusieurs avertissements avec cette syntaxe:
la source
Le premier langage où je suis tombé sur ceci était awk (qui a aussi sa part de syntaxe "bizarreries"; points-virgules optionnels, concaténation de chaînes en utilisant uniquement des espaces et ainsi de suite ...) Je pense que les concepteurs de DTrace, qui ont basé la syntaxe D de manière lâche sur awk, avait assez de sens pour NE PAS copier ces fonctionnalités, mais je ne me souviens pas du haut de ma tête. Un exemple simple (compter le nombre de balises ENTITY dans une DTD, depuis mon Mac):
Si ce petit script était à la place écrit avec l'accolade sur une ligne propre, voici ce qui se passerait:
la source