Почему AMD определяет свои необязательные аргументы в порядке, обратном характеру javascript?

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

  •  21-12-2019
  •  | 
  •  

Вопрос

Насколько я знаю, многие javascript-коды все еще используют IIFE в качестве шаблона своего пространства имен, и я полагаю, что разработчики javascript привыкли к обычно есть что-то еще, не ожидайте, что вы увидите все, если прочитаете код только с самого начала;иногда пустые круглые скобки, иногда больше аргументов.

Я прочитал часть из require.js, и увидел корректировку дополнительных аргументов в своем define реализация:

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;
    }

    // .. 

Я хотел бы лучше понять, почему это определено таким образом, и должен ли я следовать этому способу, когда собираюсь определять свои собственные API?

Спецификация: AMD

Это было полезно?

Решение

Функции, которые принимают аргументы в случайном или очень необязательном порядке, просто дают вам некоторые синтаксический сахар.Это не обязательно то, к чему вы должны стремиться, но приятно, если это получается.

Я могу привести пример, в котором аргументы следующие нет неплохо:

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

Вы должны передать undefined как функцию replacer (поскольку у меня нет функции replacer, это необязательно).Конечно, было бы тривиально добавить что-то вроде опубликованного вами кода, который проверяет тип 2-го и 3-го аргумента, чтобы уменьшить его до:

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

В Java (не JavaScript) у вас есть полиморфные функции, такие как:

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

public function get(List list) {}

В зависимости от того, как вы звоните get он вызовет любую из этих реализаций.Когда вы реализуете это, вы можете увидеть что-то вроде:

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

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

Так что на самом деле в этом не так уж много смысла, просто синтаксический сахар.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top