Присваивание скобками в закрытии в исходном коде d3 - PullRequest
1 голос
/ 10 июля 2020

Просматривая исходный код d3, я нашел этот фрагмент :

  scale.unknown = function(_) {
    return arguments.length ? (unknown = _, scale) : unknown;
  };

Здесь реализуется шаблон: https://bost.ocks.org/mike/chart/. Вот минимальный пример, который работает с адаптированным приведенным выше кодом:

function closure() {
  let mult

  function my(t) {
    return t * mult
  }

  my.mult = function(_) {
    return arguments.length ? (mult = _, my) : mult
  }

  return my
}

После этого вы можете использовать его следующим образом:

fn = closure()
fn.mult(2)
console.log(fn(3)) // 6
fn.mult(4)
console.log(fn(3)) // 12

Что я не понимаю в приведенном выше примере это строка:

return arguments.length ? (mult = _, my) : mult

Это проверяет, есть ли аргументы, и присваивает параметр mult, если они есть, или возвращает mult, если их нет.

Но что означают круглые скобки значит в (mult = _, my)? Что делает возвращенная функция в самый конец?

1 Ответ

2 голосов
/ 10 июля 2020

Я думаю, у вас здесь два разных вопроса.

Первый вопрос о скобках: Bostock (создатель D3) сделал это, чтобы воспользоваться оператором запятой , который он обычно использует в своих кодах. Короче говоря, это ...

return arguments.length ? (mult = _, my) : mult

Преобразуется в: имеет ли функция какой-либо переданный аргумент? Если no , вернуть значение mult; если да , вернуть функцию my И присвоить переданный параметр mult.

Тогда у вас есть второй вопрос:

Что делает возвращенная функция в самый конец?

Немного, потому что в этом нет необходимости. Тест argument.length - это просто использование геттера, то есть возврат сохраненного значения, если аргумент не передан. Это может быть просто:

return arguments.length ? mult = _ : mult;

Вы можете проверить это здесь:

function closure() {
  let mult

  function my(t) {
    return t * mult
  }

  my.mult = function(_) {
    return arguments.length ? mult = _ : mult;
  }

  return my
}

fn = closure()
fn.mult(2)
console.log(fn(3))
fn.mult(4)
console.log(fn(3))
console.log("stored value: " + fn.mult())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...