Javascript 选择时修改的执行顺序

Javascript 选择时修改的执行顺序,javascript,d3.js,Javascript,D3.js,在d3.js中,修改给定选择中所有元素方面的大量调用可以如下链接: mySelection.attr('someAttribute', function retrieveSomeAttributeValue (d) { return d.someValue; }).style('someCssProperty', function retrieveSomeCssPropertyValue (d) { return d.someValue % 2; }); 现在,对于mySele

在d3.js中,修改给定选择中所有元素方面的大量调用可以如下链接:

mySelection.attr('someAttribute', function retrieveSomeAttributeValue (d) {
    return d.someValue;
}).style('someCssProperty', function retrieveSomeCssPropertyValue (d) {
    return d.someValue % 2;
});
现在,对于
mySelection
中的每个元素,
retrieveSomeAttributeValue
retrieveSomeCsPropertyValue
都将被调用一次

但是,是否也指定了任何给定元素的执行顺序?我在文件中找不到任何明确的内容。具体地说:对于
mySelection
中的任何给定元素,
retrieveSomeAttributeValue
是否保证在
retrieveSomeCsPropertyValue
之前被调用,因为在调用链中围绕前者的
attr
调用先于围绕后者的
style
调用

一般来说:修改功能如
attr
style
是否按链接顺序应用?

编辑:由于我的问题的范围似乎有些混乱,我将试图澄清:显然,
attr
函数是在
style
函数之前调用的。但是
attr
是否将其更改应用于每个元素,然后返回结果集合,从而
style
将其更改应用于每个元素?或者,例如,
attr
style
是否以某种方式将各自的修改添加为集合对象上的挂起更改,以便在以后以可能不同的顺序执行


编辑2:由于这个问题似乎产生了一些混乱,如果有什么特别不清楚的地方,请使用评论区要求澄清。

总是因为调用
attr()
style()
append()
filter()
。。。。返回下一次调用操作的选择。此选择可能与调用操作的选择不同


在返回之前,将为选择中的每个元素调用回调(如果已定义)。在幕后没有发生异步的事情。

当涉及到处理DOM树D3时,它的实现往往非常简单,而不需要借助任何隐藏的魔法。许多对D3方法的调用或多或少会直接委托给本机DOM接口。像
.attr()
.style()
这样的方法也不例外

由于文档可能会对读者和用户隐藏库的内部工作,因此确保D3实现这些功能的最佳方法可能是深入研究其源代码。作为一个例子,让我们看看

根据文件:

选择。attr(名称[,值])

[…]否则,如果该值是一个函数,则按顺序对每个选定元素求值,并将其传递给当前数据(d)、当前索引(i)和当前组(节点),并将其作为当前DOM元素(节点[i])。然后使用函数的返回值设置每个元素的属性

这通过为调用提供两个参数来描述方法作为setter的用法:第一个是属性名,第二个是回调。该方法的源代码部分如下所示:

return this.each((value == null                          // <== For all nodes in this selection...
    ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
    ? (fullname.local ? attrFunctionNS : attrFunction)   // <== ...set to callbacks return value.
    : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
此调用返回的函数将在其第一行执行回调(由
value
引用)。基于该调用返回的值,如果该值等于
null
,它将删除该属性,或者将属性的值设置为回调的返回值。这两个操作分别使用两个标准domapi方法或


从这几行代码可以很容易地看出,D3没有使用任何隐藏的魔法或内在状态,而是直接转发到本机DOM方法。出于同样的原因,您可以保证在选择中的每个节点上,您的回调都会按照链接的顺序被调用。

否决投票的原因是什么?无可否认,我是一个被这个问题弄糊涂的人,这个问题导致了我现在的自删除答案。我首先假设您一直在询问JS运算符优先级和关联性,这是您在第一次编辑时纠正的印象。我还是不知道你到底在问什么。从字面上理解这个问题,答案很简单:不,没有隐藏的魔力。然而,我一直在问自己,为什么你会问这样一个显而易见的问题,通过查看D3的源代码就可以很容易地找到。我想肯定还有更多。“你有任何怀疑导致这一点吗?”AltouMulu:首先,我不认为这是“显而易见的事情”,考虑到D3.JS如何在令人惊讶的简单调用中隐藏了一些复杂性。除此之外,查看库的源代码很少是回答此类问题的好方法。除了肯定存在的机会之外,我可能会错过其中的一些东西,我发现的任何东西都只代表了图书馆当前的行为,而没有给出任何迹象,表明它是否是预期的行为,或者只是碰巧在当前的实施中以这种方式工作。我要找的是来自文件的某种保证。。。。。。这表明在链式
attr
调用和类似选择的执行顺序方面存在某种行为。我认为这是一个不错的答案。也许我只是对“在返回之前,为选择中的每个元素调用回调(如果已定义)”(aspect)过于谨慎(因为我认为我在指定“将X分配给Y并返回”之前遇到过其他库有一些复杂的幕后工作在进行,这意味着实际的任务只会在稍后发生,在返回后的一些懒惰的评估中)。我现在会接受这个答案,但如果我后来接受了另一个更好的答案,我会投赞成票。也许你指的是对
转换的呼叫。它们可以在
星上
function attrFunction(name, value) {
  return function() {
    var v = value.apply(this, arguments);       // Evaluate the callback. 
    if (v == null) this.removeAttribute(name);  // Standard method call.
    else this.setAttribute(name, v);            // Standard method call.
  };
}