Понимание метода вызова в D3 - PullRequest
1 голос
/ 20 июня 2020

Мне сложно понять, как метод call используется в D3 и как это сравнивается с другими его применениями в JavaScript.

Мое понимание того, как метод call используется в стандарте JS заключается в том, что он позволяет вызывать функцию в определенном контексте. Например:

let JoJo = {
    name: `JoJo`,
    age: 33
};

function sayName(){
  console.log(`My name is ${this.name}`);
}

sayName.call(JoJo);

Это гарантирует, что sayName () вызывается в контексте JoJo (то есть, как если бы это был метод объекта JoJo).

Но, похоже, отличается от того, как он используется здесь Скоттом Мюрреем:

var xAxis = d3.svg.axis()
                  .scale(xScale)
                  .orient("bottom");
svg.append("g")
    .call(xAxis);

Как объясняет Мюррей:

Функция call () D3 принимает выбор как ввод и руки этот выбор отключен от любой функции ... Этот g становится выбором для следующего звена в цепочке. call () передает этот выбор функции xAxis, поэтому наша ось создается в новом g.

Итак, в первом примере call используется для вызова функции в контексте конкретный объект (вызов которого принимает в качестве аргумента). Во втором случае он просто передает объект функции (вызов которой принимает в качестве аргумента).

Я новичок как в JS, так и в D3, но мне кажется, что есть два в этих примерах происходит совсем другое. Ясно, что мне здесь не хватает чего-то фундаментального. Если бы кто-нибудь мог пролить свет на это, был бы очень признателен!

1 Ответ

1 голос
/ 20 июня 2020

Ваш первый пример - Function.prototype.call, который не имеет ничего общего с D3 selection.call: разные методы, то же имя.

Любопытно, что внутри D3 selection.call используется Function.prototype.apply, что очень похоже на Function.prototype.call. Между прочим, в D3 есть и другие методы, которые имеют то же имя, что и методы vanilla JavaScript, например selection.filter, которые можно спутать с Array.prototype.filter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...