Javascript回调设计:有副作用可以吗?
考虑以下javascript函数:Javascript回调设计:有副作用可以吗?,javascript,callback,Javascript,Callback,考虑以下javascript函数: function(){ var someArr = [...]; var someObj = {...}; someArr.forEach(function(item){ if (matchItem(item)){ someObj.callMethod(item.someProp); } }); } 假设给定代码工作正常,让我们看看它的设计。正如您所注意到的,someAr
function(){
var someArr = [...];
var someObj = {...};
someArr.forEach(function(item){
if (matchItem(item)){
someObj.callMethod(item.someProp);
}
});
}
假设给定代码工作正常,让我们看看它的设计。正如您所注意到的,someArr.forEach
传递了一个回调函数。同时,objectsomeObj
属于该回调的范围。因此,我们可以从回调函数内部操纵someObj
也就是说,在这种情况下回调会产生副作用
我们还可以将someObj
绑定到回调的this
对象:
function(){
var someArr = [...];
var someObj = {...};
someArr.forEach(
function(item){
if (matchItem(item)){
this.callMethod(item.someProp);
}
},
someObj
);
}
同样,我们在这里产生了一些副作用,尽管是以更明确的方式。一般来说,这种方法不能被认为是有效的,因为它违反了无副作用原则
在这种情况下,我们应该如何设计代码?哪种方式更健壮?最佳实践是什么
谢谢大家! 我建议在programmers.stackexchange.com上问这个问题。有没有办法把这个问题转移到programmers.stackexchange.com上,或者我应该在这里删除它,然后在那里发布新的问题?是的,在JavaScript中有副作用是可以的。根据经验,最好不要有副作用。然而,不变性并不总是实用的。即使是像Haskell这样的默认纯语言也允许您产生副作用(您只需明确说明副作用)。顺便说一下,如果
callMethod
是副作用的,那么您的代码才是副作用的。