Я думаю, у вас здесь два разных вопроса.
Первый вопрос о скобках: 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())