在javascript中,这个函数是纯函数吗

在javascript中,这个函数是纯函数吗,javascript,functional-programming,Javascript,Functional Programming,我不确定这个函数是否是纯函数 因为我可以从外部改变结果 function add() { var args = [].slice.call(arguments); var fn = function() { var fn_args = [].slice.call(arguments) return add.apply(null, args.concat(fn_args)) } fn.toString = function() {

我不确定这个函数是否是纯函数

因为我可以从外部改变结果

function add() {
    var args = [].slice.call(arguments);
    var fn = function() {
        var fn_args = [].slice.call(arguments)
        return add.apply(null, args.concat(fn_args))
    }
    fn.toString = function() {
        return '' + args.reduce(function(acc, prev){
            return acc + prev
        })
    }
    return fn;
}

1。函数结果是否可预测,即返回值是否始终相同?2.有副作用吗?如果这两点对于JavaScript或任何其他语言中的函数都是正确的,那么它就是“纯的”。我不清楚你为什么认为最后一个代码片段告诉了我们函数的纯性。它在引用上是透明的。您的实现涉及改变本地状态这一事实不会影响此属性。然而,实现并不纯粹。这就是说,由于您无法在单个表达式中创建函数并在其上定义方法,因此您别无选择,因此无需担心。关于结果的突变,@jonsharp是对的,它与纯度无关。但是,如果您愿意的话,可以很容易地使结果不可变,但这不会改变函数本身返回的内容。下次调用
add(1)
(或者
add(任何东西)
,它不会返回
toString
返回
“hello”
的内容,是吗?你可以改变一些东西,这些东西会改变函数的所有进一步返回,比如你在数组上调用的方法的定义,但是在某种程度上JavaScript本身是不纯净的,函数本身是纯净的。结果是可变(函数)对象并不重要。调用者有责任不改变他们不拥有的对象。函数结果是否可预测,即返回值是否始终相同?2.有副作用吗?如果这两点对于JavaScript或任何其他语言中的函数都是正确的,那么它就是“纯的”。我不清楚你为什么认为最后一个代码片段告诉了我们函数的纯性。它在引用上是透明的。您的实现涉及改变本地状态这一事实不会影响此属性。然而,实现并不纯粹。这就是说,由于您无法在单个表达式中创建函数并在其上定义方法,因此您别无选择,因此无需担心。关于结果的突变,@jonsharp是对的,它与纯度无关。但是,如果您愿意的话,可以很容易地使结果不可变,但这不会改变函数本身返回的内容。下次调用
add(1)
(或者
add(任何东西)
,它不会返回
toString
返回
“hello”
的内容,是吗?你可以改变一些东西,这些东西会改变函数的所有进一步返回,比如你在数组上调用的方法的定义,但是在某种程度上JavaScript本身是不纯净的,函数本身是纯净的。结果是可变(函数)对象并不重要。调用者有责任不改变他们不拥有的对象。
var result = add(1);
result.toString = () => 'hello';