D'accord. Bon ben c'est parfait. Merci à tous !
pour la peine je vais vous mettre plein de bons points![]()
D'accord. Bon ben c'est parfait. Merci à tous !
pour la peine je vais vous mettre plein de bons points![]()
les portée en javascript son à la fois simple et difficiles.
simple parce qu'il n'y a qu'une seule et unique règle
un objet est visible de tout contexte d'exécution descendant du contexte dans lequel il a été créé.
j'ai bien écrit objet que ce soit une variable un objet js une fonction la règle est toujours la même.
maintenant quelque complication.
lorsqu'on crée une variable dans une fonction sans utiliser le mot clef var
celle-ci est crée dans le contexte global.
si on utilise le mot clef var elle est crée dans le contexte d’exécution de la dite fonction.
si le code de cette fonction créé lui-même d'autre fonction (locales) les contextes d’exécution de ces fonctions étant fils du précédent la variable leur sera connue.
un détail d'importance.en javascript on peut définir une fonction soit en
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 fn1 = function() { fn2 = function() { }; var fn3 = function() { }; function fn4() { } }soir
Code : Sélectionner tout - Visualiser dans une fenêtre à part function fn (){}les deux sont équivalente pour la définition mais pas pour la portée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part fn = function (){}
dans l'exemple ci dessus lors de l'exécution de fn1 les fonction fn2 fn3 et fn4 sont crées.
fn2 est un nom définit sans le mot clef var la fonction est donc globale.
fn3 l'est avec var c'est une fonction locale.
fn4 est toujours locale.
la référence this à un fonctionnement identique à celui que l'on trouve dans java. la seule différence avec java est qu'il n'est pas implicite en javascript.
donc this.toto est toujours différent de toto
pour les développeur java la notion de fonction n'existe pas seule les méthodes pleuvent l'être.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 var a = { toto:45, show: function () { alert(this.toto); //ici this c'est l'objet a } };
en javascript une fonction est un objet this dans le corps de la fonction représente l'objet lui-même soit donc la fonction.le piège est que si j'utilise fn comme constructeur d'objet alors this n'est plus la fonction mais l'objet construit.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 var fn = function() { this.toto =45; alert(this.toto); }; fn(); //ici dans le corps de la fonction this c'est l'objet fonction : fn alert(fn.toto);les closures :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 var fn = function() { this.toto =45; alert(this.toto); }; var b = new fn(); //ici dans le corps de la fonction this c'est l'objet construit b alert(b.toto);
l'utilisation de corps de fonction pour isoler des espace d'objet se nome closure le plus souvent on utilise des fonctions anonymesLe pb est que pour pouvoir invoquer une fonction il faut en avoir une référence (un non en général mais là elle est anonyme). On indique à l'interprète qu'on va utiliser le résultat de cette définition en le plaçant entre ()
Code : Sélectionner tout - Visualiser dans une fenêtre à part fn() {...}ceci est une référence à la fonction anonyme définie dans les (). pour l'invoquer il suffit donc comme avec tout référence de faire un appel.
Code : Sélectionner tout - Visualiser dans une fenêtre à part (fn() {...})ainsi le code entre {} est exécuté et les objets définit à l’intérieur sont détruit
Code : Sélectionner tout - Visualiser dans une fenêtre à part (fn() {var a = 45; ...})()
dès qu'il n'existe plus de référence à ce bloc.
A+JYT
Excellentes explications !
Mais à un détail près selon moi :
Non, this représente toujours l'objet qui l'a appelé, donc, dans le cadre d'une fonction comme dans ton exemple, this représente l'objet window :en javascript une fonction est un objet this dans le corps de la fonction représente l'objet lui-même soit donc la fonction.
en revanche, si l'on se sert de la fonction comme constructeur, this représentera bien l'instance de l'objet puisque c'est elle qui a appelé le constructeur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 var fn = function() { this.toto =45; alert(this); // affiche [object Window] }; fn(); //ici dans le corps de la fonction this c'est l'objet fonction : fn alert(fn.toto+' - ' + toto); // affiche undefined - 45 => toto a bien été défini pour l'objet window ;)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 var fn = function() { this.toto =45; alert(this); // différent selon l'appel }; fn(); //ici dans le corps de la fonction this c'est l'objet fonction : fn alert(fn.toto+' - ' + toto); var inst = new fn(); alert(inst.toto); // 45
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScript • JavaScript et le DOM par la pratique • PHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum
Merci Bovino et sekajin. C'était des super explications ! Hésitez pas à faire un tuto à partir de ce topic. Je suis sûr que ça peut aider bcp de monde, parce que ces subtilités constituent justement le point du javascript que je trouve le plus obscure et sur lequel ont ne trouve généralement que des informations confuses, partielles et même parfois carrément FAUSSES !
oui sorry pour window
je réfléchissais en pensant à js hors du navigateur
Meaculpa
A+JYT
Partager