100 votes

Javascript : différence entre une déclaration et une expression ?

J'ai demandé este Après avoir réfléchi à cette question, je me suis demandé où se trouve la frontière apparemment floue entre les termes "déclaration" et "expression". Toutes les déclarations sont-elles aussi des expressions ? D'où viennent les valeurs de retour dans une console REPL ? Elles ne semblent pas toujours avoir un sens intuitif. Bien sûr, si vous tapez 1+1 vous obtiendrez 2 mais d'autres fois, la logique n'est pas aussi évidente.

Étant donné que tout ce qui est tapé dans REPL produit un peu de cela signifie-t-il qu'elle peut être utilisée dans le code source JS à la fois comme une expression et une déclaration autonome ?

peut être une chaîne de code qui pourrait être utilisée pour _X_ dans l'extrait suivant peut également être utilisé pour les éléments suivants _Y_ et vice versa ? if(_X_) _Y_

68voto

ZER0 Points 7358

Toutes les déclarations sont-elles aussi des expressions ?

"Partout où JavaScript attend une déclaration, vous pouvez également écrire une expression. Une telle déclaration s'appelle une déclaration d'expression. L'inverse n'est pas vrai : vous ne pouvez pas écrire une instruction là où JavaScript attend une expression. Par exemple, une instruction if ne peut pas devenir l'argument d'une fonction."

Ceci est tiré d'un article récent d'Axel Rauschmayer sur ce sujet : Expressions et déclarations en JavaScript

J'espère que cela vous aidera.

62voto

Selon MDN :

Une expression est toute unité de code valide qui se résout en une valeur.

En tant que tel, tout ce qui peut être utilisé comme une rvalue est une expression.

Le critère est le suivant no si des effets secondaires existent. Les expressions peuvent certainement avoir des effets secondaires. Par exemple a=2 est une expression car elle a une valeur (2) et attribue également une valeur à une variable. C'est pourquoi vous pouvez faire des choses comme :

let a;
let b = 1 + (a = 2); // a is now 2 and b is 3

Il est possible qu'un même bloc de code (textuel) soit considéré à la fois comme une expression y une déclaration en fonction du contexte. Par exemple, l'extrait de texte function f(){} est une expression à la ligne 1 et une instruction à la ligne 2 dans le code ci-dessous :

let g = function f() {};
function f() {};

Ainsi, il n'est pas possible (dans le cas général) de déterminer si quelque chose est une expression ou une déclaration en examinant un morceau de code textuel hors de son contexte ; il s'agit plutôt d'une propriété d'un nœud dans un arbre syntaxique qui ne peut être déterminée qu'après l'analyse (mentale ou réelle) du code.

En outre, et c'est peut-être plus important, les instructions de fonction (c'est-à-dire les déclarations de fonction) à l'intérieur d'une fonction f font partie du contexte d'exécution qui est créé lorsque la fonction f est invoquée. Toutefois, les expressions de fonctions ne no font partie de ce contexte d'exécution.

Un effet souvent cité est que les déclarations de fonctions sont "hissées" alors que les expressions de fonctions ne le sont pas.

Un effet plus subtil peut également être observé expérimentalement dans les récursions profondes, étant donné que les instructions de fonction occupent de l'espace dans le contexte d'exécution alors que les expressions de fonction n'en occupent pas. Par exemple, le code ci-dessous utilise la récursion infinie d'une fonction f . Fonction f Dans le premier cas, il contient une expression de fonction, dans le second cas, il contient la déclaration de fonction équivalente :

// Function Expression
{
    let i = 0;
    try {

        function f () {
            i++;
            (function g() {})(); // this is an expression
            f();
        }

        f();

    } catch (err) {
        console.log(`Function Expressions case: depth of ${i} reached. Error: ${err.name}`);
    }
}
// Function Declaration
{
    let i = 0;
    try {
        function f () {
            i++;
            function g() {}; // this is a statement
            g();
            f();
        }

        f();

    } catch (err) {
        console.log(`Functions Declarations case: depth of ${i} reached. Error: ${err.name}`);
    }
}

Sur ma machine, j'obtiens systématiquement le résultat suivant (en node.js) :

Function Expressions case: depth of 17687 reached. Error: RangeError
Functions Declarations case: depth of 15476 reached. Error: RangeError

ce qui est cohérent avec le fait que les déclarations de fonctions augmentent la quantité d'espace nécessaire pour contenir un contexte d'exécution et consomment donc un peu plus rapidement l'espace de la pile et diminuent ainsi légèrement la profondeur maximale de récursion.

37voto

U-ways Points 1128

Dans ses termes les plus simples, expressions sont évalués à produire une valeur . D'autre part, déclarations sont exécutées pour faire quelque chose .

21voto

Praveen Points 189

L'expression produit ou évalue une certaine valeur.

Exemples d'expressions : new Date() produit un nouvel objet Date sans aucun effet secondaire. [1,2,3] produit un nouveau tableau sans aucun effet secondaire. 5+6 produit une nouvelle valeur 11. Il produit simplement une nouvelle valeur sans aucun effet secondaire.

Une déclaration produit un certain comportement ou fait quelque chose et elle a également des effets secondaires. En fonction de l'effet secondaire, les déclarations peuvent être classées en catégories.

x=5; est une déclaration et son effet secondaire est l'affectation ou la modification de x.

setTimeout() - Le début de la minuterie est l'effet secondaire.

Les déclarations sont généralement séparées par un point-virgule.

Les déclarations d'expression sont les expressions qui ont un effet secondaire ou simplement "expression avec effet secondaire".

Exemples de déclaration d'expression :

x+=6; L'expression complexe (groupe d'expressions primaires) effectue une affectation qui est un effet secondaire, appelée expression statement.

delete a[2];

15voto

Mo Ali Points 3823

Expression : une unité de code qui se résout en une valeur, par exemple, littéraux & opérateurs . Exemples d'expressions :

> 3
> 1 + 2
> "expression"
> fn()
> []
> {}

Déclaration : une unité de code représentant une instruction ou plus, qui commence généralement par un mot clé réservé au langage et se termine, explicitement o implicitement avec un terminateur d'instruction. Exemples d'instructions :

> 3;
> let x = 3;
> if () {}
> for () {}
> while () {}

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