Maison >interface Web >js tutoriel >Arguments: une bizarrerie JavaScript

Arguments: une bizarrerie JavaScript

Joseph Gordon-Levitt
Joseph Gordon-Levittoriginal
2025-03-08 00:23:12615parcourir

arguments: A JavaScript Oddity

Arguments: une bizarrerie JavaScript

Les plats clés

  • Arguments »est un objet local de type tableau disponible à l'intérieur de chaque fonction JavaScript, contenant tous les arguments fournis à la fonction lorsqu'elle a été appelée. Ce n'est pas un vrai tableau, car il ne possède pas de méthodes de tableau standard comme Push et Pop.
  • Malgré ses limites, les «arguments» sont un outil puissant, permettant la création de fonctions flexibles qui acceptent un nombre variable d'arguments, qui peuvent être convertis en un vrai tableau à l'aide de la méthode du tableau, Slice.
  • arguments "dispose également d'une propriété" Callee "qui contient une référence à la fonction qui a créé l'objet" Arguments ", permettant à une fonction anonyme de se référer à elle-même. Cela peut être utilisé pour créer des fonctions d'auto-référence et des fonctions avec des arguments prédéfinis.

Les arguments sont le nom d'un objet local en forme de tableau disponible dans chaque fonction. Il est original, souvent ignoré, mais la source d'une grande magie de programmation; Toutes les principales bibliothèques JavaScript puisent dans la puissance de l'objet Arguments. C'est quelque chose que chaque programmeur JavaScript devrait se familiariser.

À l'intérieur de n'importe quelle fonction, vous pouvez y accéder via la variable: arguments, et il contient un tableau de tous les arguments qui ont été fournis à la fonction lorsqu'elle a été appelée. Ce n'est pas en fait un tableau JavaScript; Les arguments types renvoient la valeur: "Objet". Vous pouvez accéder aux valeurs d'argument individuelles via un index de tableau, et il a une propriété de longueur comme les autres tableaux, mais il n'a pas les méthodes de tableau standard comme Push and Pop.

Créer des fonctions flexibles

Même s'il peut sembler limité, les arguments sont un objet très utile. Par exemple, vous pouvez faire des fonctions qui acceptent un nombre variable d'arguments. La fonction de format, trouvée dans la bibliothèque Base2 par Dean Edwards, montre cette flexibilité:

function format(string) {
  var args = arguments;
  var pattern = new RegExp("%([1-" + arguments.length + "])", "g");
  return String(string).replace(pattern, function(match, index) {
    return args[index];
  });
};

Vous fournissez une chaîne de modèle, dans laquelle vous ajoutez des détenteurs de lieux pour les valeurs utilisant% 1 à% 9, puis fournissez jusqu'à 9 autres arguments qui représentent les chaînes à insérer. Par exemple:

format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear");

Le code ci-dessus renvoie la chaîne "et les papiers veulent savoir dont vous portez la chemise".

Une chose que vous avez peut-être remarquée est que, dans la définition de la fonction du format, nous avons spécifié un seul argument: String. JavaScript nous permet de transmettre n'importe quel nombre d'arguments à une fonction, quelle que soit la définition de la fonction, et l'objet d'arguments a accès à tous.

Convertissez-le en un vrai tableau

Même si les arguments ne sont pas un vrai tableau JavaScript, nous pouvons facilement le convertir en un en utilisant la méthode du tableau standard, Slice, comme ceci:

var args = Array.prototype.slice.call(arguments);

La variable Args contiendra désormais un objet de tableau JavaScript approprié contenant toutes les valeurs de l'objet d'arguments.

Créer des fonctions avec des arguments prédéfinis

L'objet Arguments nous permet d'effectuer toutes sortes d'astuces JavaScript. Voici la définition de la fonction MakeFunc. Cette fonction vous permet de fournir une référence de fonction et n'importe quel nombre d'arguments pour cette fonction. Il renverra une fonction anonyme qui appelle la fonction que vous avez spécifiée et fournit les arguments prédéfinis avec tout nouveau argument fourni lorsque la fonction anonyme est appelée:

function format(string) {
  var args = arguments;
  var pattern = new RegExp("%([1-" + arguments.length + "])", "g");
  return String(string).replace(pattern, function(match, index) {
    return args[index];
  });
};

Le premier argument fourni à MakeFunc est considéré comme une référence à la fonction que vous souhaitez appeler (oui, il n'y a pas de vérification d'erreur dans cet exemple simple) et il est supprimé du tableau des arguments. MakeFunc renvoie ensuite une fonction anonyme qui utilise la méthode d'application de l'objet de fonction pour appeler la fonction spécifiée.

Le premier argument pour s'appliquer fait référence à la portée que la fonction sera appelée; Fondamentalement, le mot-clé cela fera référence à l'intérieur de la fonction appelée. C'est un peu avancé pour le moment, donc nous le gardons simplement nul. Le deuxième argument est un tableau de valeurs qui seront converties en l'objet d'arguments pour la fonction. MakeFunc concaène le tableau d'origine de valeurs sur le tableau des arguments fournis à la fonction anonyme et le fournit à la fonction appelée.

Disons qu'il y avait un message que vous aviez besoin de publier où le modèle était toujours le même. Pour vous enregistrer de toujours devoir citer le modèle chaque fois que vous appelez la fonction de format, vous pouvez utiliser la fonction d'utilité MakeFunc pour renvoyer une fonction qui vous appellera le format et remplira automatiquement l'argument du modèle:

format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear");

Vous pouvez appeler la fonction Majortom à plusieurs reprises comme ceci:

var args = Array.prototype.slice.call(arguments);

Chaque fois que vous appelez la fonction Majortom, il appelle la fonction de format avec le premier argument, le modèle, déjà rempli. Les appels ci-dessus renvoient:

function makeFunc() {
  var args = Array.prototype.slice.call(arguments);
  var func = args.shift();
  return function() {
    return func.apply(null, args.concat(Array.prototype.slice.call(arguments)));
  };
}

Créer des fonctions d'auto-référence

Vous pouvez penser que c'est plutôt cool, mais attendez, les arguments ont une autre surprise; Il a une autre propriété utile: Callee. Arguments.Callee contient une référence à la fonction qui a créé l'objet Arguments. Comment pouvons-nous utiliser une telle chose? arguments.Callee est une manière pratique, une fonction anonyme peut se référer à elle-même.

var majorTom = makeFunc(format, "This is Major Tom to ground control. I'm %1.");
majorTom("stepping through the door");
majorTom("floating in a most peculiar way");
"This is Major Tom to ground control. I'm stepping through the door."
"This is Major Tom to ground control. I'm floating in a most peculiar way."
repeat is a function that takes a function reference, and 2 numbers. The first number is how many times to call the function and the second represents the delay, in milliseconds, between each call. Here's the definition for repeat:

Cependant, je veux créer une version spéciale de cette fonction qui se répète 3 fois avec un retard de 2 secondes entre chaque fois. Avec ma fonction répétée, je peux faire ceci:

function repeat(fn, times, delay) {
  return function() {
    if(times-- > 0) {
      fn.apply(null, arguments);
      var args = Array.prototype.slice.call(arguments);
      var self = arguments.callee;
      setTimeout(function(){self.apply(null,args)}, delay);
    }
  };
}

Le résultat de l'appel de la fonction quelque chose est une boîte d'alerte répétée 3 fois avec un délai de 2 secondes entre chaque alerte.

function format(string) {
  var args = arguments;
  var pattern = new RegExp("%([1-" + arguments.length + "])", "g");
  return String(string).replace(pattern, function(match, index) {
    return args[index];
  });
};

Les questions fréquemment posées sur les arguments JavaScript

quel est l'objet «Arguments» dans JavaScript?

L'objet «Arguments» est une variable locale disponible dans toutes les fonctions non-f sur en JavaScript. Il contient une structure de type réseau avec tous les arguments transmis à la fonction. Cet objet est utile lorsqu'une fonction doit gérer des nombres variables d'arguments. Il est important de noter que l'objet «Arguments» n'est pas un tableau réel, mais il peut être converti en un si nécessaire.

Comment puis-je convertir l'objet «Arguments» en un tableau?

Bien que les objets «arguments» se comportent comme un tableau, il ne l'hérite pas du prototype de tableau, donc les méthodes d'arrivée ne peuvent pas être directement appliqués. Cependant, vous pouvez le convertir en un tableau à l'aide de la méthode Array.from () ou de l'opérateur de diffusion (…). Voici un exemple:

Fonction convertargStoArray () {
var argsArray = array.from (arguments);
// ou
var argsArray = [... arguments];
}

fonctions flèches. Les fonctions Arrow n'ont pas leur propre objet «arguments». Cependant, ils peuvent accéder à l'objet «Arguments» à partir de la fonction parentale non-zone la plus proche.

Quel est l'opérateur «typeof» en javascript?

L'opérateur «typeof» en JavaScript est utilisé pour déterminer le type de données d'une valeur ou d'une variable donnée. Il renvoie une chaîne indiquant le type d'opérande non évalué. Par exemple, «Typeof 3» renverra «numéro», et «Typeof« Hello »» renverra «String».

Comment puis-je utiliser «Typeof» avec «Arguments» dans JavaScript?

Vous pouvez utiliser l'opérateur «Typeof» pour vérifier le type de chaque argument transmis à une fonction. Voici un exemple:

Fonction CheckArgStype () {
for (var i = 0; i console.log (typeof arguments [i]);
}
}

que «arguments [0]» signifient dans les javascript? Le premier argument est passé à une fonction. De même, «les arguments [1]» se réfèrent au deuxième argument, etc. Si aucun argument n'est passé, «arguments [0]» seront «indéfinis».

Puis-je modifier l'objet «Arguments» dans JavaScript?

Oui, vous pouvez modifier l'objet «Arguments» en mode non stricte. Cependant, il n'est généralement pas recommandé car cela peut conduire à un code déroutant et difficile à déborder. En mode strict, toute tentative de modification de l'objet «Arguments» lancera une erreur.

Quelle est la propriété de longueur de l'objet «Arguments»?

La propriété de longueur de l'objet «Arguments» renvoie le nombre d'arguments qui ont été transmis à la fonction. Il est utile lorsque vous avez besoin d'itérer sur les arguments ou de déterminer le nombre d'arguments passés.

Puis-je utiliser l'objet «Arguments» avec des paramètres par défaut dans JavaScript?

Oui, mais avec une mise en garde. Si une fonction avec des paramètres par défaut est appelée avec moins d'arguments que les paramètres, l'objet «Arguments» ne contiendra que les arguments réels passés, pas les valeurs par défaut.

Quelle est la propriété «Callee» de l'objet «arguments»?

La propriété «callee» de l'objet «arguments» est une référence à la fonction exécutée actuellement. Cette propriété est obsolète et ne doit pas être utilisée dans le nouveau code. Au lieu de cela, vous pouvez utiliser des expressions de fonction nommées ou des fonctions flèches.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn