Javascript 如果我需要3个循环而不是1个循环,那么没有副作用的意义是什么?
假设我有一个问题对象列表。我必须找出它们是否可见,如果它们可见,我也必须将它们的答案改为可见。(这个例子可能不实用,只是一个例子) 如果这是没有副作用的方式(是吗?): 这是副作用的方式:Javascript 如果我需要3个循环而不是1个循环,那么没有副作用的意义是什么?,javascript,side-effects,Javascript,Side Effects,假设我有一个问题对象列表。我必须找出它们是否可见,如果它们可见,我也必须将它们的答案改为可见。(这个例子可能不实用,只是一个例子) 如果这是没有副作用的方式(是吗?): 这是副作用的方式: questions.forEach(function(question) { if (question.isVisible) { var answer = getAnswer(visibleQuestion); answer.isVisible = true;
questions.forEach(function(question) {
if (question.isVisible) {
var answer = getAnswer(visibleQuestion);
answer.isVisible = true;
}
});
如果你必须重复3次才能完成你的工作,为什么要选择无副作用的方式呢
注:关于什么是副作用,什么不是副作用,以及处理这一问题的两种方法,我可能是错的。反对回调和副作用的论点是关于可维护性和回收调用堆栈,因此我们可以使用
throw
和return
等关键字
您提供的示例显然让它看起来像是在可读性和效率之间进行简单的工程权衡。也就是说,使用promise库,您可以在单个循环中实现相同的结果,而不会产生回调/副作用
promise.all(questions.map(function(question) {
if (question.isVisible) {
resolve(getAnswer(question));
}
}).then(function (arResults) {
arResults.forEach(function(answer) {
answer.isVisible = true;
console.log(answer)
});
});
我认为,如果您使用的是纯粹的无副作用代码,您不会返回原始的
答案;您可以返回原始答案的副本,但isVisible
设置为true
。在这种情况下,为了避免副作用而费尽周折是没有意义的。如果JS的map
和filter
是懒惰的,那么实际上你只迭代了一次。正如Zev所提到的,你在第二次map
中无论如何都会产生副作用,所以你在强制使用函数式风格,但坚持命令式实践。这两个不太合拍。
promise.all(questions.map(function(question) {
if (question.isVisible) {
resolve(getAnswer(question));
}
}).then(function (arResults) {
arResults.forEach(function(answer) {
answer.isVisible = true;
console.log(answer)
});
});