不从js函数返回任何内容是一种不好的做法吗?

时间:2018-11-07 21:14:34

标签: javascript reactjs

一段时间以来我一直在使用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})
    }

在这里,我没有返回任何东西,而是更改了全局变量(例如this.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?因此,我相信上面的所有函数都返回未定义。

关于这个,我有两个问题,

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

如果要改进此代码,您会提出什么建议?

4 个答案:

答案 0 :(得分:3)

这取决于情况。

如果您正在使用方法来更改基于状态的应用程序中的状态,则不从函数中返回任何内容也没有错。在这种情况下,优先级是完成action而不是处理数据。您基本上是说“嘿,应用程序,这已经改变了!重新渲染!”

但是,如果您发现自己处理的数据(数组或对象)不是状态的一部分,并且由于没有报告action,那么最好遵循functional programming paradigm,而不是变异该数据,而是创建具有相同数据类型的新实体,然后填充并返回它。

答案 1 :(得分:1)

当您问到可以在该代码中进行哪些改进时,我建议将for (let j=0; j<data[i]["peaks"].length; j++)替换为for (let j of data[i]["peaks"]),我认为这是遍历数组的更好形式。

答案 2 :(得分:1)

不,很好。

唯一的建议是尝试在数组上使用.map而不是三重for循环和推入,但是说实话,您看起来还不错。

答案 3 :(得分:0)

根据specifications,“如果未返回值,则函数返回未定义。” 要回答您的问题:

1)“不从函数返回任何东西是一种不好的做法吗?”否。返回undefined的函数可以被视为其他语言中的“过程”,即,一个子程序可能会产生一些副作用,但不会返回任何值。

2)“如果要改进此代码,您会提出什么建议?”与返回undefined的函数无关。