我正在用react.js结合d3.js编写代码。 但有一个小问题,但我不明白它的行为..
componentWillMount() {
this.setState({
dummyData: [{
price: 13,
age: 43,
etc: 99
},
{
price: 33,
age: 22,
etc: 100
}]
}
componentDidMount () {
this.keys = Object.keys(this.state.dummyData[0]);
console.log(this.keys) // ["price", "age", "etc"]
}
someMethod(){
console.log(this.keys) // ["price", "age", "etc"]
this.svg.append('g')
.selectAll('g')
.data(this.state.dummyData)
.enter()
.append('g')
.attr('transform', d => {
console.log(this.keys); // ["price", "age", "etc"]
return 'translate(' + this.x0(d.name) + ', 0)';
})
.selectAll('rect')
.data( function(d){
console.log(this.keys); // undefined
return this.keys.map( function(key){ return { key: key, value: d[key] }; }); }) // This statement causes an error
.enter()
.append('rect')
.attr('x', function(d){ return this.x1(d.key) })
.attr('y', function(d){ return this.y(d.value) })
.attr('width', this.x1.bandwidth())
.attr('height', function(d){ return height - this.y(d.value) })
.attr('fill', function(d){ return this.z(d.key) });
}
...
从代码中可以看出,this.keys 保持其值,直到到达第二次数据调用。我真的不明白那时会发生什么。
最佳答案
这是因为作用域和函数在 javascript 中的工作方式。如果您将函数更改为箭头函数,它将自动绑定(bind)范围,您将看到您所期望的内容。
简单解释一下:箭头函数会自动绑定(bind)它们声明的作用域,而函数不会,因此您必须显式地将所需的作用域绑定(bind)到函数。
关于javascript - 与 javascript 和 d3.js 中的作用域相关的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51036859/