Maison >interface Web >js tutoriel >Explication détaillée de la création d'objets de fonction JavaScript, des paramètres et des instances de portée
" "Constructeur" :
La liste de paramètres peut avoir autant de paramètres que vous le souhaitez, suivis du corps de la fonction, par exemple :
imprimera le résultat :
var funcName = new Function( [argname1, [... argnameN,]] body );Mais qui créerait une fonction d'une manière aussi difficile à utiliser ? Si le corps de la fonction est complexe, il faudra beaucoup d'efforts pour assembler la chaîne, donc JavaScript fournit une sorte de sucre de syntaxe, c'est-à-dire via des littéraux Pour créer une fonction :
var add = new Function("x", "y", "return(x+y)"); print(add(2, 4));
ou :
En fait, un tel sucre syntaxique est plus susceptible de mal comprendre les programmeurs des domaines traditionnels. Le mot-clé function appellera Function crée un nouvel objet et transmet avec précision la liste des paramètres et le corps de la fonction au constructeur de la fonction.
function add(x, y){ return x + y; }Pas de différence. Ils ajoutent tous dynamiquement un nouvel attribut à l'objet global, c'est tout.
var add = function(x, y){ return x + y; }Afin d'illustrer que les fonctions, comme d'autres objets, existent en tant qu'objet indépendant dans le système d'exécution JavaScript, autant regarder cet exemple :
var str = "This is a string";
function p(){ print("invoke p by ()"); } p.id = "func"; p.type = "function"; print(p); print(p.id+":"+p.type); print(p());En JavaScript. , les paramètres de la fonction C'est assez intéressant. Par exemple, vous pouvez passer n'importe quel nombre de paramètres à une fonction, même si la fonction est déclarée sans spécifier de paramètres formels, par exemple :
function (){ print("invoke p by ()"); } func:function invoke p by ()
En fait, lorsque JavaScript gère les paramètres de fonction, c'est différent des autres langages compilés. Ce que l'interpréteur transmet à la fonction est une valeur interne de type tableau appelée arguments. Cela se fait lorsque l'objet fonction est généré. . est initialisé. Par exemple, lorsque nous transmettons un paramètre à adPrint, les deux autres paramètres ne sont pas définis. De cette façon, nous pouvons traiter ces paramètres non définis à l'intérieur de la fonction adPrint, qui peuvent être exposés à l'extérieur : nous pouvons traiter n'importe quel paramètre.
function adPrint(str, len, option){ var s = str || "default"; var l = len || s.length; var o = option || "i"; s = s.substring(0, l); switch(o){ case "u": s = s.toUpperCase(); break; case "l": s = s.toLowerCase(); break; default: break; } print(s); } adPrint("Hello, world"); adPrint("Hello, world", 5); adPrint("Hello, world", 5, "l");//lower case adPrint("Hello, world", 5, "u");//upper case
Hello, world Hello hello HELLO
Portée de la fonction
function sum(){ var result = 0; for(var i = 0, len = arguments.length; i < len; i++){ var current = arguments[i]; if(isNaN(current)){ throw new Error("not a number exception"); }else{ result += current; } } return result; } print(sum(10, 20, 30, 40, 50)); print(sum(4, 8, 15, 16, 23, 42));//《迷失》上那串神奇的数字 print(sum("new"));
150 108 Error: not a number exception
Les fonctions JavaScript s'exécutent dans la portée locale et les fonctions s'exécutent dans la portée locale Le corps peut accéder à ses variables externes (éventuellement de portée globale) et fonctions. La portée de JavaScript est la portée lexicale. La portée lexicale signifie que sa portée est déterminée lors de sa définition (analyse lexicale), et non lors de son exécution, comme dans l'exemple suivant :
public void method(){ for(int i = 0; i < obj1.length; i++){ //do something here; } //此时的i为未定义 for(int i = 0; i < obj2.length; i++){ //do something else; } }Quel est le résultat en cours d'exécution ? Les débutants sont susceptibles d'obtenir cette réponse :
function func(){ for(var i = 0; i < array.length; i++){ //do something here. } //此时i仍然有值,及I == array.length print(i);//i == array.length; }
Et le résultat correct devrait être :
var str = "global"; function scopeTest(){ print(str); var str = "local"; print(str); } scopeTest();
Parce que dans la définition de la fonction scopeTest, la variable non déclarée str est accédée à l'avance puis la variable str est initialisée, le premier print(str) renverra une erreur non définie. Alors pourquoi la fonction n'accède-t-elle pas à la variable str externe à ce moment-là ? En effet, une fois l'analyse lexicale terminée, lors de la construction de la chaîne de portée, la variable var définie dans la fonction sera mise dans la chaîne, donc str est dans l'ensemble de la fonction scopeTest sont tous visibles (de la première ligne à la dernière ligne du corps de la fonction). Puisque la variable str elle-même n'est pas définie, le programme est exécuté séquentiellement et renverra un défini à la première ligne. valeur à str, donc la troisième ligne print(str) de la ligne renverra "local".
global local
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!