Я изо всех сил пытаюсь понять, как работает этот код JavaScript. Я изучаю JS и не подвергаюсь динамическому функциональному языку раньше. Таким образом, я визуализую вызовы функций в процедуре бит, иерархическом порядке. С d3.js, можно сделать SVG элементы, как описано hereЦепочка функций
var dataset = [ 5, 10, 15, 20, 25 ];
d3.select("body").selectAll("p")
.data(dataset)
.enter()
.append("p")
.text("New paragraph!");
Давайте изменим последнюю строку:
.text(function(d) { return d; });
Проверьте, что новый код делает на этой демонстрационной странице.
Whoa! Мы использовали наши данные для заполнения содержимого каждого абзаца, благодаря магии метода data(). Вы видите, что при объединении методов в любое время после вызова данных() вы можете создать анонимную функцию, которая принимает d как вход. Метод magical data() гарантирует, что d устанавливается в соответствующее значение в вашем исходном наборе данных, учитывая текущий элемент.
Эта магия, упомянутая выше, является тем, что я не понимаю. «d» не является глобальной переменной, так как если я перехожу на другое (c) имя, оно все равно работает. Таким образом, метод data
может устанавливать значение для анонимного fn.
Но, как правило, (с моим ограниченным чтением) цепочка возможна, потому что текущая функция возвращает объект, на который может быть вызван следующий метод. В приведенном выше случае метод data
знает, передается ли текст («Новый абзац!») Пользователем, иначе передайте данные анонимному fn. У сомнений есть метод text
вниз по линии, и data()
уже выполнен. Как данные передаются анонимной функции?
спасибо.
вы пригвоздили его. Большое спасибо. функция данных сохраняет отдельные значения в __data__ https://github.com/mbostock/d3/wiki/Selections#wiki-data. Один быстрый qn, хотя анонимный fn принимает только один аргумент, и через вызов он обеспечивает 4. Как это работает? – bsr
Вы говорите о 'callback.call (node, node .__ data__, i, j)', правильно? Первым аргументом является область - 'this' внутри обратного вызова, затем идут данные, вы имеете в виду ее как' d', а затем - индексы. Для javascript не имеет значения, сколько именных аргументов вы используете - вы можете указать любое количество аргументов функции. Все аргументы доступны с использованием переменной 'arguments'. Именованные аргументы - это просто ярлык. Btw, заменить 'function (d) {return d; } 'с' function (d, i, j) {return d; } 'и проверьте это сами. – Li0liQ
еще раз за вашу помощь! – bsr