1. Les variables locales sont d'abord utilisées puis déclarées, ce qui n'affecte pas les variables externes du même nom.
Copiez le code comme suit :
var x = 1; // --> variable externe x
fonction fn(){
alert(x); // --> la variable locale non définie x est utilisée en premier
var x = 2; // déclarer et attribuer plus tard
}
fn();
alerte(x); // --> 1<BR>
Le premier point est que la première phrase de la fonction fn génère x et x est défini dans la deuxième phrase. Ceci est autorisé dans JS, et autorisé ici signifie que le programme peut s'exécuter sans erreurs de syntaxe.
Mais cela n'est pas autorisé dans d'autres langages comme C et Java. Les variables doivent être déclarées avant utilisation, telles que
Copiez le code comme suit :
Test de classe publique {
public static void main (String[] arguments) {
System.out.println(x); //Utiliser en premier
int x = 10; // Post-déclaration
}
}
En Java, le compilateur génère une erreur et le programme ne peut pas s'exécuter.
Le deuxième point est que la variable locale x au sein de la fonction fn n'affectera pas la variable externe x. Autrement dit, la sortie d'alerte dans fn n'est pas 1, mais indéfinie.
Deuxièmement, les paramètres formels ont une priorité plus élevée que les noms de fonctions.
Copiez le code comme suit :
fonction fn(fn){
alerte(fn);
}
fn('bonjour'); // --> "bonjour"
Vous pouvez voir que le nom de la fonction et le paramètre formel ont le même nom que fn, et que la sortie est la chaîne "hello", mais pas le corps de la fonction (fn.toString()) de la fonction fn.
Troisièmement, les paramètres formels ont une priorité plus élevée que les arguments.
Copiez le code comme suit :
fonction fn(arguments){
alerte(arguments);
}
fn('bonjour'); // --> "bonjour"<BR>
L'objet arguments peut être utilisé directement dans la fonction et constitue un identifiant spécial fourni par le langage lui-même.
Ici, il arrive que le paramètre formel soit déclaré avec le même nom. Vous pouvez voir que le résultat est "hello" au lieu de "[object Object]", c'est-à-dire que les arguments des paramètres formels couvrent les arguments réels fournis par le langage lui-même.
4. Les paramètres formels ont une priorité plus élevée que les variables locales déclarées mais non attribuées.
Copiez le code comme suit :
fonction fn(a){
var une;
alerte(a);
}
fn('bonjour'); // --> "bonjour"
Le paramètre formel de la fonction fn est a. La première phrase de la fonction déclare uniquement la variable locale a, mais n'attribue pas de valeur. Du fait que le résultat de sortie est « bonjour » au lieu de non défini, on peut voir que le paramètre formel a a une priorité plus élevée que la variable locale a qui est uniquement déclarée mais sans valeur assignée.
5. Les variables locales déclarées et attribuées ont une priorité plus élevée que les paramètres formels.
Copiez le code comme suit :
fonction fn(a){
var a = 1 ;
alerte(a);
}
fn('bonjour'); // --> "1"
Le paramètre formel de la fonction fn est a. La première phrase de la fonction déclare uniquement la variable locale a et lui attribue la valeur 1. D'après le résultat de sortie est "1" au lieu de "hello", nous pouvons voir que la variable locale déclarée et attribuée a a une priorité plus élevée que le paramètre formel a.
6. Lorsque les paramètres formels sont attribués à des variables locales portant le même nom
Copiez le code comme suit :
fonction fn(a){
var une = une;
alerte(a);
}
fn('bonjour');
Ne l'exécutez pas encore, devinez le résultat. Si vous suivez le point 5 : les variables locales déclarées et attribuées ont une priorité plus élevée que les paramètres formels. Alors a sera indéfini. Mais en fait a est "bonjour", c'est-à-dire que le a droit est le paramètre formel a et le a gauche est la variable locale a.
Les deux a ici n’interfèrent pas l’un avec l’autre et aucun ne se couvre l’autre. Ceci est contradictoire avec ce que je viens de dire : les variables locales assignées ont une priorité plus élevée que les paramètres formels. Mais le moteur fait ce que nous voulons, car nous ne voulons pas que a soit indéfini après var a = a.