Code JavaScript ne fonctionne pas

Le problème exposé dans ce sujet a été résolu.

Par comme en python, j’entend ne rien mettre devant les noms des variables, ça tient toujours? Moi ça fonctionne en tout cas.

Osimoquus

Non c’est une extrêmement mauvaise idée.1 Ne fais jamais ça. C’est pire qu’utiliser var, et il ne faut jamais utiliser var.

Tiens, je t’ai fait un puzzle :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
function foo (x) {
  console.log(z);
  y = x;
  var z = y;
}

foo(2);

console.log(typeof x === 'undefined' ? 'undefined' : x);
console.log(typeof y === 'undefined' ? 'undefined' : y);
console.log(typeof z === 'undefined' ? 'undefined' : z);
  • Qu’est-ce qui est affiché par ce programme ? Pourquoi ?
  • Que se passe-t-il si tu mets y au lieu de z à la ligne 2 ? Pourquoi ça fait ça avec y mais pas avec z ?

Comment évaluer ton résultat avec mon petit puzzle :

  • Si tu fais tout juste sans tester, bravo, t’as bien pigé pourquoi ne pas déclarer tes variables est démoniaque et pourquoi var est une atrocité. Et donc tu ne feras jamais ni l’un ni l’autre.
  • Si t’as pas fait tout juste, bravo, t’as bien pigé pourquoi ne pas déclarer tes variables ou utiliser var te fera écrire du code que tu ne comprendras pas. Et comme t’as pas envie de pas comprendre les programmes que tu écris, tu ne feras jamais ni l’un ni l’autre.

  1. Le scoping des variables en python est pété, mais moins pété que JavaScript. 

+0 -0

Que dois-je écrire pour déclarer les variables dans ce cas?

Si j’ai bien compris, le premier alert me renvoi undefined parce que la variable n’est pas déclarée, le second undefined car c’est simplement un paramètre qui n’existe pas en dehors de la fonction, le troisième renvoi 2, tout simplement, et le dernier… Je n’arrive pas à comprendre. Cela me renvoi undefined parce que la variable n’est pas déclarée en dehors de foo()?

+0 -0

Que dois-je écrire pour déclarer les variables dans ce cas?

Osimoquus

Comme je l’ai dit plusieurs fois dans mes précédents messages dans ce sujet : déclare les variables avec const, ou parfois let. Mais presque toujours const.

N’utilise jamais var. Déclare toutes tes variables, ne jamais, jamais faire x = truc sans avoir déclaré x ou sans déclarer x.

Lis ceci :

+0 -0

Je viens de lire la doc de const, je pensais que const en JavaScript permettait de faire une variable à valeur fixe comme la plupart des langages avec les constantes. Ce qui explique mon précédent message "ironie ou lapsus ?".

Const permet juste d’éviter de ne pas autoriser une deuxième déclaration après ? Je ne comprends pas pourquoi il l’autorise dans let…

A-312, const c’est référence constante, pas valeur constante.

1
2
3
4
5
6
7
8
9
const x = []
const y = {}
x.push(12)
y.foo = x
x.push(72)
console.log(y.foo[1] === 72) // true

x = 1 // TypeError: Assignment to constant variable.
y = 1 // TypeError: Assignment to constant variable.
1
2
3
4
5
6
let x = 17
let y
x = 11
y = 12
x++
console.log(x === y) // true

Tu comprends ? Tu sembles faire pas mal de JS à en juger par ton activité sur les sujets qui parlent de JS, je te recommande de bien apprendre et comprendre comment déclarer et utiliser des variables, ça t’aidera.

+0 -0

Pourquoi ce code fonctionne :

1
2
console.log(c); //Affiche 3
c = 3;

et pas celui-ci :

1
2
console.log(c); //Affiche undefined
var c = 3;

D’après cette page, le hissage en js ne fonctionne que pour les déclaration et pas pour les initialisations.

Aussi, si j’utilise const pour déclarer, je ne pourrais modifier la valeur de ma variable. Et si j’utilise let et que je déclare dans un bloc d’instruction ma variable ne sera pas déclarée ailleurs, c’est ça?

En fait, je ne vois toujours pas vraiment pourquoi ne pas utiliser var, même avec ton puzzle.

+0 -0

Pourquoi ce code fonctionne :

1
2
console.log(c); //Affiche 3
c = 3;

Non, ça ne fonctionne pas. Tu devrais ici avoir une erreur l.1 parce que c n’est pas défini.

1
2
console.log(c); //Affiche undefined
var c = 3;

D’après cette page, le hissage en js ne fonctionne que pour les déclaration et pas pour les initialisations.

Exactement, donc la déclaration de c est hoisté mais son initialisation. Donc c est undefined, puis tu log, puis c est initialisé à 3.

Aussi, si j’utilise const pour déclarer, je ne pourrais modifier la valeur de ma variable.

Relis bien ce que je dis, et relis bien la page MDN. const ne déclare pas une valeur constante. Re-regarde mes exemples. Tiens :

1
2
3
4
5
const x = []
console.log(x.length === 0) // true
x.push(1)
x.push(1)
console.log(x.length === 2) // true

Et si j’utilise let et que je déclare dans un bloc d’instruction ma variable ne sera pas déclarée ailleurs, c’est ça?

Exactement.

En fait, je ne vois toujours pas vraiment pourquoi ne pas utiliser var, même avec ton puzzle.

Osimoquus
  1. Parce que var n’existe plus que pour que les vieux programmes fonctionnent.
  2. var n’est pas scopé dans un block.
  3. Tout à fait valide et dangereux :

    1
    2
    var x = 1;
    var x = 'salut';
    

Bref tu fais ce que tu veux, continue à utiliser var si tu veux, tu perdras un temps fou à débugger des problèmes absurdes mais tu fais ce que tu veux. :)

+0 -0

Ah oui, j’ai compris la nuance pour const. Donc j’utilise const tout le temps et si je veux modifier manuellement la valeur de ma variable, j’utilise let?

Si par exemple je veux échanger la valeur de deux variables?

PS : Je suis désolé de t’harceler, mais c’est pas évident quand tu débute. :(

+0 -0

Non non : utilise const tout le temps, ça empêche pas de modifier la valeur.

C’est comme si tu nommes ton tiroir "Robert". Sans changer quoi que ce soit au fait que ton tiroir se nomme Robert, tu peux en modifier le contenu. La seule règle c’est que tu changes pas le prénom d’un truc et que t’as pas plusieurs trucs qui ont le même nom.

Donc si demain tu décides qu’en fait Robert c’est ton vélo, là non t’as un problème : Robert c’est un tiroir pas un vélo.

Ton tiroir s’appelle constamment Robert.

+0 -0

Non, une constante n’est pas censé changer de valeur, en pratique on peux (parfois, pas dans les navigateurs corrects), mais ce n’est pas prévu :

Constants are block-scoped, much like variables defined using the let statement. The value of a constant cannot change through re-assignment, and it can’t be redeclared.

Source : MDN

Note : par contre, les propriétés de l’objet peuvent changer.

+0 -1

Non, une constante n’est pas censé changer de valeur, en pratique on peux (parfois, pas dans les navigateurs corrects), mais ce n’est pas prévu :

Constants are block-scoped, much like variables defined using the let statement. The value of a constant cannot change through re-assignment, and it can’t be redeclared.

Source : MDN

Note : par contre, les propriétés de l’objet peuvent changer.

Titi_Alone

Tu n’as pas compris ce que tu lis.

Ce code ne fonctionne pas :

1
2
const a = 3;
console.log(a++);

Cela renvoi :

Uncaught TypeError: Assignment to constant variable.

Donc je me vois obliger d’utiliser let dans ce cas…

Osimoquus

Tu n’as pas compris ce que j’ai dit. Ce que ton code fait, c’est donner le nom a à l’objet 4. L’objet 3 est déjà assigné à a. Tu n’as donc pas le droit. Reprends mon exemple de tiroir et remplace Robert par a, tiroir par 3, vélo par 4, si ça t’aide.

La référence doit être constante, la valeur elle peut changer. C’est pas une question de navigateur, Titi_Alone, tu te plantes. Si a fait référence à 3, plus tard a ne peut pas faire référence à 4. La référence est constante. 4 n’est pas une valeur modifiée de 3, c’est un autre objet.

+0 -0

(Ce n’est pas dans mon habitude de dériver le sujet lorsque l’OP n’a pas encore résolut son problème mais je me permets encore un petit "HS". J’espère que ça ne te dérange pas Osimoquus)

Tu comprends ? Tu sembles faire pas mal de JS à en juger par ton activité sur les sujets qui parlent de JS, je te recommande de bien apprendre et comprendre comment déclarer et utiliser des variables, ça t’aidera.

victor

Il y a plusieurs facteurs :

  • J’ai dû mal à me tenir à jour sur le JavaScript (je l’ai dis sur un sujet où tu participais, il me semble que c’était pour String.endWith()). Du mal, dans le sens que j’ai aucun site de confiance à suivre donc bon… Et de ceux que j’ai survolé, la majorité conseillait d’utiliser let et non const. Je n’ai pas trop me temps de multiplier mes sources.
  • Je pars du principe à tort que j’ai toujours fais sans const. Mon code fonctionne et que je n’ai jamais eu de problème spécifique avec var et les scopes de variable.
  • Je maintiens plusieurs scripts qui utilisent var, et je n’ai pas le temps à essayer de remplacer par const car j’ai peur d’avoir des erreurs avec la modification de scope. Et de perdre du temps pour rien.

Mais maintenant que j’ai lu ce sujet, je vais prendre l’habitude d’utiliser const/let. Pour mes nouvelles lignes de code.

+0 -0

La référence doit être constante, la valeur elle peut changer. C’est pas une question de navigateur, Titi_Alone, tu te plantes. Si a fait référence à 3, plus tard a ne peut pas faire référence à 4. La référence est constante. 4 n’est pas une valeur modifiée de 3, c’est un autre objet.

victor

Ok, donc c’est inutilisable dans au moins 20% des cas (grosso-merdo), on est bien d’accord ; c’est bon pour stocker des objets (EDIT : ou des arrays, tu vois le truc), pas pour autre chose.

+0 -0

Ce n’est pas du hors-sujet, on est parti sur autre chose ici et comme je débute à peine, la question des variables m’intéresse!

J’essais pas d’avoir raison @Victor, je souhaite juste comprendre. Ici, l’histoire de const me laisse un peu perplexe. Je ne comprend pas trop.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte