Странное поведение, связанное с областью действия в javascript и d3.js - PullRequest
0 голосов
/ 26 июня 2018

Я пишу код вact.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 остается его значением до тех пор, пока не достигнет второго вызова данных.Я действительно не понимаю, что происходит в этот момент.

1 Ответ

0 голосов
/ 26 июня 2018

Это из-за того, как область действия и функции работают в JavaScript. Если вы измените свою функцию на функцию стрелки, она автоматически свяжет сферу и вы увидите то, что ожидаете.

В качестве краткого объяснения: функции со стрелками автоматически связывают область, в которой они были объявлены, в то время как функции этого не делают, поэтому вам нужно явно привязать область, которую вы хотите, к функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...