javascript 不从js函数返回任何东西是不好的做法吗?

e5nszbig  于 2023-09-29  发布在  Java
关注(0)|答案(5)|浏览(111)

我使用react已经有一段时间了,我发现我通常不从函数返回任何东西,而只是调用函数,更改全局变量等等。
例如,考虑我的index.js file in react app
这里我有一个函数,它为图表格式化数据

graphDataFormating = () => {  
      let m = 0
      let arrayPush = []
      let data = this.state.data["groups"]
      let Datalength = this.state.data["groups"].length  
      this.graphdata = []
        if (!this.state.optionalTask)   Datalength = 1
        for (let i=0; i<Datalength; i++) {
            for (let j=0; j<data[i]["peaks"].length; j++) {
                  arrayPush = []
                for (let k=0; k<data[i]["peaks"][j]["eic"]["rt"].length; k++) {
                    if (this.state.filterIntensity < data[i].peaks[j]["eic"]["intensity"][k] && this.state.filterRt < data[i].peaks[j]["eic"]["rt"][k]) {
                        arrayPush.push({
                            y: (data[i]["peaks"][j]["eic"]["intensity"][k]/1000),
                            x: data[i]["peaks"][j]["eic"]["rt"][k]
                        })
                    }
                }
                this.graphdata[m] = arrayPush
                m++
            }
      }

      this.setState({graphData: this.graphdata})
    }

在这里,我没有返回任何东西,而是更改了全局变量(如.graphdata[m])或状态this.setState({graphData: this.graphdata})
我在程序中多次调用这个函数

userFilterData = (event) => {
    this.setState({[event.target.name]: event.target.value}, () => {
        this.graphDataFormating()
    })
  }

  resetData = () => {
    this.setState({  filterIntensity: -1, filterRt: -1}, () => {
        this.graphDataFormating()
    })
  }

  changetask = () => {
      this.setState({ optionalTask: !this.state.optionalTask}, () => {
        this.graphDataFormating()
      })

但是我创建的所有函数,包括graphDataFormating(),我一次也没有返回任何东西。
我猜如果js函数不返回任何东西,它会自动返回undefined?因此,我相信上面的所有函数都返回undefined。

我有两个问题

不从函数返回任何东西是一种不好的做法吗?
如果你要改进这段代码,你会给予什么建议?

u3r8eeie

u3r8eeie1#

说实话,这取决于。
如果你在一个基于状态的应用程序中使用方法来改变你的状态,那么不从函数返回任何东西没有什么错。在这种情况下,优先级是完成action,而不是数据操作。您基本上是在说 “嘿,应用程序,这已经改变了!投降吧!"
但是,如果你发现自己操作的数据(数组或对象)不是状态的一部分,并且由于没有报告action,最好遵循functional programming paradigm,而不是改变数据,创建一个相同数据类型的新实体,填充它,并返回它。

2jcobegt

2jcobegt2#

当你问到你可以在代码中改进什么的时候,我建议用for (let j of data[i]["peaks"])代替for (let j=0; j<data[i]["peaks"].length; j++),我认为这是一种更好的数组循环形式。

yizd12fk

yizd12fk3#

不,它的罚款。
唯一的建议是尝试在数组上使用.map,而不是三重for循环和推送,但说实话,你所拥有的看起来非常好。

zz2j4svz

zz2j4svz4#

根据规范,“如果没有返回值,则函数返回undefined。”
1)“不从函数返回任何东西是一种不好的做法吗?返回undefined的函数在其他语言中可以被认为是一个“过程”,例如:一个可能有副作用但不返回任何值的子例程。
2)“如果你要改进这个代码,你会给予什么建议?“没有与返回undefined的函数相关的内容。

0mkxixxg

0mkxixxg5#

我知道这篇文章是旧的,但我今天偶然发现它,并认为我会添加。
这并不是错误的,但用另一种方式做也有好处。
如果你重构了你的代码,像这样传入和返回:

getFormattedData = (data, filterIntensity, filterRt) => {
  let m = 0;
  let arrayPush = [];
  let data = data['groups'];
  let Datalength = data['groups'].length;
  const graphdata = [];
  if (!this.state.optionalTask) Datalength = 1;
  for (let i = 0; i < Datalength; i++) {
    for (let j = 0; j < data[i]["peaks"].length; j++) {
      arrayPush = [];
      for (let k = 0; k < data[i]["peaks"][j]["eic"]["rt"].length; k++) {
        if (filterIntensity < data[i].peaks[j]['eic']['intensity'][k] && filterRt < data[i].peaks[j]['eic']['rt'][k]) {
          arrayPush.push({
            y: (data[i]['peaks'][j]['eic']['intensity'][k] / 1000),
            x: data[i]['peaks'][j]['eic']['rt'][k],
          });
        }
      }
      graphdata[m] = arrayPush;
      m++;
    }
  }

  return graphdata;
};

然后,您可以在不接触状态的情况下测试此函数,并根据需要使用尽可能多的选项。
看起来你甚至不需要设置filterIntensityfilterRt状态。

resetData = () => {
  this.setState({
    graphdata: this.getFormattedData(
      this.state.data,
      -1,
      -1,
    ),
  })
}

相关问题