Что происходит в этом коде Javascript? - PullRequest
2 голосов
/ 09 июля 2019

Я пытаюсь понять, как этот скрипт делает то, что делает.

  object.variable = function(_) {
    return arguments.length ? (variable = functor(_), object) : variable;
  };

Он явно используется для разрешения переопределения значения variable по умолчанию для object, но что будет не так с этим кодом:

  object.variable = function(_) {
    return arguments.length ? variable = _ : variable;
  };

НайдяФункция функтора:

function functor(d) {
  return typeof d === "function" ? d : function() { return d; };
}

Я вижу, что это гарантирует, что все, что передается, обрабатывается как функция.

Так почему эта конструкция в Javascript, (variable = functor(_), object), я непонять, как это работает?Почему не просто variable = functor(_)

Ответы [ 3 ]

2 голосов
/ 09 июля 2019

Так почему эта конструкция в Javascript, (variable = functor(_), object), я не понимаю, как это работает? Почему не просто variable = functor(_)

Автор этого подхода в основном использует comma-operator для вызова functor(...) и, наконец, возврата object.

comma-operator выполняет выражения, разделенные запятой, поэтому последним выражением будет результат его выполнения.

Взгляните на это:

let result = (1,2,3,4,5 === 5);
console.log(result); // Here will be printed true because 5 === 5 was the last expression.
2 голосов
/ 09 июля 2019

Как видите, разница в возврате объекта:

object.variable = function(_) {
    return arguments.length ? (variable = functor(_), object) : variable;
};

можно записать так:

object.variable = function(_) {

    if (arguments.length) {
        variable = functor(_);
        return object;
    } else {
        return variable;
    }
};

Принимая во внимание, что

object.variable = function(_) {
    return arguments.length ? variable = _ : variable;
};

можетбыть написано так:

object.variable = function(_) {
    if (arguments.length) {
        variable = _;
    } else {
        return variable;
    }
};
0 голосов
/ 09 июля 2019

var variable = (f(1), f(2));

приводит к выполнению f(1) и f(2) в указанном порядке (как упоминалось выше, оператор запятой ), при этом variable присваивается значение f(2). Следовательно, в первом примере, если указан аргумент, присваивается functor(_) variable и возвращается object. Если аргумент отсутствует, ничего не произойдет, и будет возвращено variable.

Чрезвычайно важно указать, что этот код пронизан антипаттернами, и, если он не является частью какой-либо школьной задачи, его следует подвергнуть рефакторингу, поскольку он сбивает с толку. Например:

  • Вы никогда не должны присваивать и возвращать значение в одном и том же выражении.
  • Вы не должны вызывать функцию functor, если functor не является правильным именем (имена функций должны быть описательными)
  • Вы не должны проверять arguments, если в этом нет крайней необходимости - если вы действительно передаете именованный аргумент, почему бы просто не проверить !!_?
  • Если вы не используете lodash или underscore, почему вы называете аргумент _? Что это вообще значит, что это представляет?
  • Вы должны избегать (1, 2) обозначений, если только это не является абсолютно необходимым, это делает код ненужным, чтобы следовать за ним. Вместо этого используйте if. Какая польза от выполнения всех этих действий в одной строке кода?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...