D3.js事件侦听器无法访问“”;这个“;当使用ES6箭头功能时
D3.js event listeners cannot access "this" when ES6 arrow functions are used
我正在尝试使用带有箭头函数的D3.js事件侦听器,但它似乎不起作用。
此 绑定到未定义。
如何使用ES6箭头函数访问this?
ES5:
svg.selectAll('circle')
.data(data)
.enter()
.append('circle')
.attr('r', '10')
.attr('cx', (d) => x(d.day))
.attr('cy', (d) => y(d.amount))
.on('mouseenter', function (d) {
console.log(this); // output '<circle r="10" cx="10" cy="1"/>'
});
ES6(使用箭头功能):
svg.selectAll('circle')
.data(data)
.enter()
.append('circle')
.attr('r', '10')
.attr('cx', (d) => x(d.day))
.attr('cy', (d) => y(d.amount))
.on('mouseenter', (d) => {
console.log(this); // output: 'undefined'
});
这是预期行为。(以下是我解释这种行为的拙劣尝试。你最好读一下)
执行箭头函数的上下文(this
)将是定义它们的上下文(无论this
在函数之外是什么)
D3可能会将事件侦听器的上下文设置为发出事件的对象(如ES5示例中所示)。
但是,通过使用箭头函数,您将强制上下文绑定到定义函数的上下文。在您的情况下,此上下文是未定义的/window,因为您的代码不包含在另一个函数中。
如果我将您的ES6示例转换回ES5,也许会更好地解释):
var self = this;
svg.selectAll('circle')
.data(data)
.enter()
.append('circle')
.attr('r', '10')
.attr('cx', (d) => x(d.day))
.attr('cy', (d) => y(d.amount))
.on('mouseenter', (d) => {
console.log(self); // output: 'undefined'
});
我对解决你的问题的建议很简单。使用常规的function
作为您的事件订阅者(对您的两个"属性"订阅者使用箭头函数也没有任何好处)。
svg.selectAll('circle')
.data(data)
.enter()
.append('circle')
.attr('r', '10')
.attr('cx', (d) => x(d.day))
.attr('cy', (d) => y(d.amount))
.on('mouseenter', function(d) {
console.log(this); // output '<circle r="10" cx="10" cy="1"/>'
});
相关文章:
- 如何在ASP.Net中使用ES6功能
- 无参数的ES6箭头功能
- 如何在启用ES6功能的情况下运行Node.js应用程序
- jslint --edition=最新的意外ES6功能.常量
- CoffeeScript 是否支持 ES6 中的生成器功能?
- ES6导出默认功能
- 导入功能 es6 Javascript
- Angular 2.0 :Typescript 是否支持 ES6 的所有功能
- 对箭头功能的理解es6
- ES6箭头功能
- 在所有浏览器支持下使用ES6功能
- D3.js事件侦听器无法访问“”;这个“;当使用ES6箭头功能时
- 在 Expressjs、Node 中使用 ES6 功能
- 这是ES6的新功能吗
- ES6对象.forOwn循环遍历对象键的功能
- ES6模块语法用于多个"static"功能
- ES6导出覆盖功能
- ES6导出和导入功能
- ES6地图功能
- 你能选择哪些ES6功能可以用Babel移植吗