- Portée et contexte(s) d’une fonctionla portée d’une variable existe depuis sa déclaration et ce jusqu’à la fin de la fonction dans laquelle elle a été déclarée (peu importe l’imbrication des blocs) ;
la portée d’une fonction (non*anonyme) est globale à toute la fonction dans laquelle elle a été déclarée (on appelle cela hoisting, ou hissage en français).
SPV: En fait, les règles de portée sont les mêmes pour tous types de variable, y compris les fonctions. Le hoisting est également présent pour toutes les autres variables, donc la portée de la variable "c" est incorrecte. De même, le hoisting fonctionne pour les fonctions anonymes (à conditions d'être référencé par une variable bien entendu)
voir :
https://developer.mozilla.org/en-US/...r#var_hoisting
WCH :
1) hoisting : [CITATION]«En fait, les règles de portée sont les mêmes pour tous types de variable, y compris les fonctions » [/CITATION]
Attention, ceci est vrai si la fonction est une expression de fonction, càd, qui a été déclarée avec le mot clé « var » (on parle alors du var hoisting, cf. lien var hoisting).
Une fonction déclarée avec le mot clé « function fn(){} » peut être invoquée avant sa déclaration ; on parle alors de hoisting de fonction (
https://developer.mozilla.org/en-US/...ation_hoisting)
2) portée : l’exemple de la variable « c » est là pour démontrer qu’une variable est dispo dans la chaine de la portée, qu’à partir du moment de sa déclaration (avec ou sans le var). Voici un exemple de code qui permet d’illustrer mes propos :
SPV : il faut bien s’entendre sur les termes utilisés. Ici tu parles de portée et non d’affectation. Les règles de portée sont les mêmes pour toutes les variables :
1 2 3 4 5 6 7
| function foo() {
if (false) {
var x = 1;
}
return;
var y = 1;
} |
est interprété comme :
1 2 3 4 5 6 7 8
| function foo() {
var x, y;
if (false) {
x = 1;
}
return;
y = 1;
} |
La difference pour les fonctions non déclarées avec var est que c’est l’ensemble du corps de la fonction qui est déplacé en haut de fonction. Mais toutes les variables ont la même portée au sein d’une fonction. C’est d’ailleurs pour ça qu’on appelle ça une « portée » (scope en anglais). La preuve avec ta fonction :
1 2 3 4 5 6 7 8 9 10 11 12 13
| function fonction1(){
console.log(a+b+c); // NaN
console.log(a+b+d); // ReferenceError: d is not defined
var a = 1;
function fonction2(){ /**/ }
var b = 2;
if (a === 1) {
var c = 3;
}
}
fonction1(); |
WCH: Cette deuxième règle nous montre que, contrairement aux variables, les fonctions peuvent
être référencées avant leurs déclarations !
SPV: les variables aussi
WCH : référencer (appeler) une variable avant sa déclaration retournera « undefined » !
SPV : mais pas de ReferenceError. Donc elle est à portée, mais sa valeur ne lui a pas encore été affectée.
Partager