我使用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。
我有两个问题
不从函数返回任何东西是一种不好的做法吗?
如果你要改进这段代码,你会给予什么建议?
5条答案
按热度按时间u3r8eeie1#
是和否
说实话,这取决于。
如果你在一个基于状态的应用程序中使用方法来改变你的状态,那么不从函数返回任何东西没有什么错。在这种情况下,优先级是完成
action
,而不是数据操作。您基本上是在说 “嘿,应用程序,这已经改变了!投降吧!"但是,如果你发现自己操作的数据(数组或对象)不是状态的一部分,并且由于没有报告
action
,最好遵循functional programming paradigm,而不是改变数据,创建一个相同数据类型的新实体,填充它,并返回它。2jcobegt2#
当你问到你可以在代码中改进什么的时候,我建议用
for (let j of data[i]["peaks"])
代替for (let j=0; j<data[i]["peaks"].length; j++)
,我认为这是一种更好的数组循环形式。yizd12fk3#
不,它的罚款。
唯一的建议是尝试在数组上使用
.map
,而不是三重for循环和推送,但说实话,你所拥有的看起来非常好。zz2j4svz4#
根据规范,“如果没有返回值,则函数返回undefined。”
1)“不从函数返回任何东西是一种不好的做法吗?返回
undefined
的函数在其他语言中可以被认为是一个“过程”,例如:一个可能有副作用但不返回任何值的子例程。2)“如果你要改进这个代码,你会给予什么建议?“没有与返回
undefined
的函数相关的内容。0mkxixxg5#
我知道这篇文章是旧的,但我今天偶然发现它,并认为我会添加。
这并不是错误的,但用另一种方式做也有好处。
如果你重构了你的代码,像这样传入和返回:
然后,您可以在不接触状态的情况下测试此函数,并根据需要使用尽可能多的选项。
看起来你甚至不需要设置
filterIntensity
和filterRt
状态。