There is an idiomatic way of doing this in D3: just use the less famous third argument:
selection.on("mouseenter", (d, i, nodes) => {
d3.select(nodes[i]);
});
And that's the same of:
selection.on("mouseenter", function() {
d3.select(this);
});
I wrote an example here: d3 v4 retrieve drag DOM target from drag callback when `this` is not available
Here is a demo:
d3.selectAll("circle").on("mouseover", (d, i, p) => {
d3.select(p[i]).attr("fill", "maroon")
})
.on("mouseout", (d, i, p) => {
d3.select(p[i]).attr("fill", "seagreen")
});
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg>
<circle cx="50" cy="50" r="20" fill="seagreen"></circle>
<circle cx="125" cy="50" r="20" fill="seagreen"></circle>
<circle cx="200" cy="50" r="20" fill="seagreen"></circle>
</svg>
Actually, if you look at the end of the article you linked, he gives the same solution.
Your proposed solution, d3.event.target, despite working for event listeners, does not work in several situations. For instance:
d3.selectAll("circle").each(()=>d3.select(d3.event.target).attr("fill", "red"))
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg>
<circle cx="50" cy="50" r="20" fill="seagreen"></circle>
<circle cx="125" cy="50" r="20" fill="seagreen"></circle>
<circle cx="200" cy="50" r="20" fill="seagreen"></circle>
</svg>
But the same code works using the third argument:
d3.selectAll("circle").each((d,i,p)=>d3.select(p[i]).attr("fill", "red"))
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg>
<circle cx="50" cy="50" r="20" fill="seagreen"></circle>
<circle cx="125" cy="50" r="20" fill="seagreen"></circle>
<circle cx="200" cy="50" r="20" fill="seagreen"></circle>
</svg>