Lionel, c'est parfois difficile de te suivre.
a écrit :
Quelle est alors la "fonction" dans le cas ou var est dans un fichier en dehors de toutes fonctions?
C'est là que Node et les navigateurs ne font pas la même chose.
Dans node, chaque fichier est à considérer comme étant lui-même une fonction; ou en d'autres termes chaque fichier JS exécuté dans node est « virtuellement encadré » par
(function(){ /* ton code */ })();
Résultat, une variable déclarée avec var dans un script Node est
locale au module.
Si ça peut t'aider à prendre conscience de cette séparation entre d'abord l'encapsulation puis ensuite l'exécution immédiate, Si tu regardes la documentation du langage lua, qui fait un peu la même chose que Node à ce sujet, tu verras qu'il existe une fonction load, qui permet de charger un fichier .lua et retourne une fonction mais ne l'exécute pas. D'ailleurs, en lua, on a le droit d'écrire return en-dehors de toute fonction.
Alors que dans un navigateur, il n'y a pas cet étape d'encadrement;
la variable est globale.
Pour ton deuxième exemple avec this, en fait on utilise une des bêtise fondamentales de JavaScript, qui veut que this représente l'objet global s'il ne vaut pas autre chose.
IL faut prendre l'habitude de
systématiquement développer en mode strict où this vaut null si la fonction n'a pas été bindée ou n'est pas clairement une méthode. ca évite des surprises de ce genre.
a écrit :
Pour le dernier lien( valeur référence) ; essayer de décrire ce qui se passe en utilisant les termes communs ne fonctionne pas pour décrire ce qui se passe car la réalité ( ce qui se passe .. le contexte ) est différente ...Car la nature de la variable passée en argument conditionne le passage par valeur ou par référence ..... ( est ce clair ? )
Je ne suis absolument pas d'accord avec les réponses données sur stack.
En JavaScript comme dans la quasi-totalité des autres langages modernes à l'exception du C++ (p.ex. Java, python, PHP, ...), tout se passe toujours par référence; ou plus exactement, on devrait dire, tout est toujours passé par
pointeur.
ON a juste faussement l'impression qu'il y a parfois des passages par valeur car certains objets sont non modifiables (immuables)
En C++ c'est différent, car on a le choix et la logique est inversée, tout est passé par valeur si on ne précise rien.
Pour reprendre l'exemple de stack, quand dans la fonction on écrit x++, ça équivaut à x=x+1. Il y a affectation d'une nouvelle référence à la variable x.
Dès lors la références initiale reste intacte ! et tu as faussement eu l'impression que, parce que c'est un nombre, le passage s'est effectué par valeur.
Mais, en fait, c'est faux
Comparons donc ce qui est comparable :
var obj = { a: 1, b: 2};
function f (o) {
o = { c: 3, d : 4 };
}
console.log(obj); // {a: 1, b: 2 }.
Ben oui, voyons. ici ça ne viendrait à l'idée de personne que la sortie puisse être {c: 3, d: 4}.
Note bien la ressemblance pourtant. remplace par o++, ou o=o+1, essaie de passer une string ou un nombre, ou autre chose encore. Tu vois bien que le processus n'est en rien différent que tu passes un objet ou un type primitif.
Maintneant on va s'amuser autrement :
var obj = { a: 1, b: 2 };
function f (o) {
o.c = 3;
}
console.log(obj.c); // undefined
f(obj);
console.log(obj.c); // 3
Jusque là rien d'extraordinaire.
var num = 3.14;
console.log(num.c); // undefined
f(num);
console.log(num.c); // undefined.
Ah ben zut alors, je te mens depuis 5 minutes ?
Non. C'est juste qu'en JavaScript ça ne fonctionne pas, parce que les nombres sont des types primitifs et non de vrais objets. Mais dans certains autres langages moins mainstream, on peut le faire...
En guise de bonne blague, remplace 3.14 par new Number(3.14). ET paf, ça marche maintenant.
En fait je ne peux pas te prouver que j'ai raison sur un passage systématique par référence. Car si on a défini que les strings étaient des objets imuables par exemple, c'est justement pour éviter des choses qui ne nous paraissent pas naturelles.
Mais informatiquement parlant, un passage par valeur signifie dupliquer la donnée en mémoire. Pour les nombres on s'en fiche, c'est 4 ou 8 octets; mais si on a une string qui contient le data URI en base64 d'une vidéo de plusieurs Mo, heureusement qu'elle n'est pas intégralement recopiée à chaque passage ou sortie de fonction.
Voilà...