Pourquoi AMD définit ses arguments facultatifs dans un ordre inverse de la nature du javascript ?

StackOverflow https://stackoverflow.com//questions/20020761

  •  21-12-2019
  •  | 
  •  

Question

Pour autant que je sache, de nombreux codes javascript utilisent encore IIFE comme modèle de leur espace de noms, et je pense que les développeurs javascript sont habitués à il y a généralement quelque chose après, ne vous attendez pas à tout voir si vous lisez le code depuis le début;parfois des parenthèses vides, parfois plus d'arguments.

J'ai lu une partie de require.js, et a vu les arguments supplémentaires s'ajuster dans son define mise en œuvre:

define=function (name, deps, callback) {
    var node, context;

    //Allow for anonymous modules
    if (typeof name!=='string') {
        //Adjust args appropriately
        callback=deps;
        deps=name;
        name=null;
    }

    //This module may not have dependencies
    if (!isArray(deps)) {
        callback=deps;
        deps=null;
    }

    // .. 

J'aimerais mieux comprendre pourquoi il est défini de cette manière, et dois-je suivre cette méthode lorsque je vais définir mes propres API ?

La spécification : DMLA

Était-ce utile?

La solution

Les fonctions qui acceptent les arguments dans un ordre aléatoire ou très facultatif ne vous en donnent que quelques-uns. sucre syntaxique.Ce n'est pas nécessairement quelque chose que vous devriez viser, mais c'est bien si cela fonctionne.

Je peux donner un exemple où les arguments sont pas bon:

JSON.stringify(data_obj, undefined, "\t");

Vous devez passer undefined comme fonction de remplacement (car je n'ai pas de fonction de remplacement, c'est facultatif).Bien sûr, il serait trivial d'ajouter quelque chose comme le code que vous avez posté qui vérifie le type du 2ème et du 3ème argument pour le réduire à :

JSON.stringify(data_obj, "\t");

En Java (pas en JavaScript), vous avez des fonctions polymorphes comme :

public function get(String string, List list) {}

public function get(List list) {}

Selon la façon dont vous appelez get il appellera l'une ou l'autre de ces implémentations.Lorsque vous les implémenterez, vous pourriez voir quelque chose comme :

public function get(String string, List list) {
     /* actual implementation */
}

public function get(List list) {
    this->get("", list); // call get with default 1st argument
}

Il n'y a donc pas vraiment beaucoup de substance, juste sucre syntaxique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top