javascript - 与 javascript 和 d3.js 中的作用域相关的奇怪行为

标签 javascript reactjs d3.js svg scope

我正在用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/

相关文章:

d3.js - D3 比例与图表不匹配

javascript - 我自己的函数中的 Node.js 请求模块出现问题

javascript - Firefox 是否有标准 API 来检查特定插件的安装?

javascript - 如何将 jQuery 函数应用于具有相同 ID 的所有元素?

javascript - 如何在选择选项时显示输入

reactjs - React-intl const <FormattedMessage/> 给出 [object object] 作为结果

reactjs - 在选项卡上单击显示内容 - React

reactjs - 在 React Table 中触发单元格 onClick 而不是行 onClick

javascript - 为 D3 饼图中的特定部分分配特定颜色

javascript - 缩放 D3 map 时出错