91 votes

N’importe quelle autre langue autre que JavaScript a-t-il une différence entre les emplacements de départ brace (même ligne et ensuite la ligne) ?

Aujourd'hui, alors que j'étais au hasard de la lecture du JavaScript modèles O'Reilly livre, j'ai trouvé une chose intéressante (page 27 pour référence).

En Javascript, dans certains cas, il existe une différence si le corset de l'endroit de départ est différent.

function test_function1() {
    return
    {
        name: 'rajat'
    };
}

var obj = test_function1();
alert(obj);  //Shows "undefined"

Alors que

function test_function2() {
    return {
        name: 'rajat'
    };
}

var obj = test_function2();
alert(obj); //Shows object

JSfiddle Démo

N'importe quel autre langage il y a un tel comportement? Si oui, alors je dois changer mes habitudes pour sûr..:)

Je suis surtout préoccupé par PHP, C, C++, Java et ruby.

53voto

Konrad Rudolph Points 231505

Toute langue qui ne repose pas sur des points-virgules (mais plutôt sur des retours à la ligne) pour délimiter les états potentiellement le permet. Envisager De Python:

>>> def foo():
...   return
...   { 1: 2 }
... 
>>> def bar():
...   return { 1: 2 }
... 
>>> foo()
>>> bar()
{1: 2}

Vous pourriez être en mesure de construire un cas similaire en Visual Basic , mais du haut de ma tête que je ne peux pas comprendre comment parce que VB est assez restrictif où les valeurs peuvent être placés. Mais la suite devrait fonctionner, à moins que la statique de l'analyseur se plaint du code inaccessible:

Try
    Throw New Exception()
Catch ex As Exception
    Throw ex.GetBaseException()
End Try

' versus

Try
    Throw New Exception()
Catch ex As Exception
    Throw
    ex.GetBaseException()
End Try

Parmi les langues que vous avez mentionné, Ruby a la même propriété. PHP, C, C++ et Java ne sont pas tout simplement parce qu'ils jeter newline comme les espaces, et nécessitent des points-virgules pour délimiter les états.

Voici le code équivalent à partir de l'exemple Python Ruby:

>> def foo
>>   return { 1 => 2 }
>> end
=> nil
>> def bar
>>   return
>>   { 1 => 2 }
>> end
=> nil
>> foo
=> {1=>2}
>> bar
=> nil

40voto

Alex Ciminian Points 4648

L'interpréteur JavaScript ajoute automatiquement un ; à la fin de chaque ligne, si il ne trouve pas (à quelques exceptions près, ne pas entrer dans ici :).

Donc, fondamentalement, le problème n'est pas les accolades' emplacement (qui représentent un objet littéral, et non pas un bloc de code comme dans la plupart des langues), mais cette petite "feature" que les forces de votre premier exemple ci - return ; => undefined. Vous pouvez vérifier le comportement de l' return dans l'ES5 spec.

Pour les autres langues qui ont un comportement similaire, découvrez Konrad réponse.

26voto

Dave Points 6972

Plus certainement. Google aller langage de programmation présente un comportement très similaire (mais avec des effets différents). Comme expliqué là:

En fait, ce qui se passe est que le langage utilise des points-virgules, comme dans le C ou le Java, mais ils sont automatiquement insérées à la fin de chaque ligne qui ressemble à la fin d'une instruction. Vous n'avez pas besoin de les saisir vous-même.

..snip...

Cette approche fait en sorte que pour le nettoyage à la recherche, point-virgule, gratuit code. La seule surprise est que c'est important de mettre l'accolade d'ouverture d'une construction comme une instruction si sur la même ligne que le if; si vous ne le faites pas, il y a des situations qui ne peut pas compiler ou peut donner un mauvais résultat. La langue forces le corset de style, dans une certaine mesure.

Secrètement, je pense que Rob Pike voulais juste une excuse pour exiger le seul Vrai Corset de Style.

14voto

jAndy Points 93076

La réponse à cette question est assez facile. Une langue qui a automatique "point-virgule" insertion pourrait être en difficulté sur cette ligne. Le problème avec cette

return
{
     name: 'rajat'
};

..c'est que le js moteur insérez un point-virgule après l' return; (et donc, de retour undefined). Cet exemple est une bonne raison pour ouvrir les accolades toujours sur le côté droit et jamais sur le côté gauche aussi. Puisque vous avez déjà remarqué correctement, si il y a une accolade dans la même ligne, le interpretator remarquerez que et ne pouvez pas insérer un point-virgule.

6voto

Brandan Points 8311

FWIW, JSLint signale plusieurs avertissements avec cette syntaxe :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X