Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript回调设计:有副作用可以吗?_Javascript_Callback - Fatal编程技术网

Javascript回调设计:有副作用可以吗?

Javascript回调设计:有副作用可以吗?,javascript,callback,Javascript,Callback,考虑以下javascript函数: function(){ var someArr = [...]; var someObj = {...}; someArr.forEach(function(item){ if (matchItem(item)){ someObj.callMethod(item.someProp); } }); } 假设给定代码工作正常,让我们看看它的设计。正如您所注意到的,someAr

考虑以下javascript函数:

function(){
    var someArr = [...];
    var someObj = {...};
    someArr.forEach(function(item){
        if (matchItem(item)){
            someObj.callMethod(item.someProp);
        }
    });
}
假设给定代码工作正常,让我们看看它的设计。正如您所注意到的,
someArr.forEach
传递了一个回调函数。同时,object
someObj
属于该回调的范围。因此,我们可以从回调函数内部操纵
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
是副作用的,那么您的代码才是副作用的。