javascript - 纯函数 vs 面向对象 Javascript

标签 javascript

阅读后this article regarding pure functions在我看来,当使用面向对象的 JavaScript 时,纯函数的概念似乎并不那么容易实现,除非你想最终调用带有大量参数或一组参数的函数。

假设我在 Javascript 对象中有以下函数。

function demo() {
    var self = this;

    //fixed in some other method
    self.order.owner = null;
    self.selectedEvent() = null;
    self.order.booking_id = null;
    self.order.order_id = null;
    self.details = null;
    self.notification = null;
    self.notifyDesk = null;
    self.additionalText = null;

    //WILL THIS FUNCTION BE PURE? 
    self.test = function() {
        if (self.order.owner && self.selectedEvent()) {
            return true;
        }
        else if(self.order.booking_id == '4000' || !self.isValid(self.order.order_id) ){
            return false;
        }
        return self.whatever;
    };

    return self;
}

var myDemo = new Demo();

//whatever other actions over the demo object here

console.log( myDemo.test() );

方法addOrder 它使用了函数作用域之外且属于对象作用域的 5 个变量。 这不是我所理解的“纯”函数,但除非我们想调用带有 5 个参数的 addOrder ,或者带有 5 个元素的单个数组参数,否则在我看来我们无法得到一个纯 Javascript 函数。

这种情况在 OO Javascript 中经常发生,并且访问对象属性是很常见的事情?

我错过了什么?请让我高兴!

最佳答案

纯函数对于任何输入x都将始终产生相同的输出y并且不会改变任何状态。只要函数不违反这些原则,它就是纯函数。

下面的示例展示了纯函数和一些非纯函数之间的区别:

var rect = {
  width: 2,
  height: 4
};

function areaPure(rectangle) {
  return rectangle.width * rectangle.height;
}

function areaImpureMutate(rectangle) {
  rectangle.area = rectangle.width * rectangle.height;
}

function areaImpureOuterState() {
  // Uses variable declared outside of scope
  return rect.width * rect.height;
}

console.log('pure:', areaPure(rect)); // no side effects

// Mutates state
areaImpureMutate(rect);
console.log('mutated:', rect.area);

// Relies on mutable state
rect.height = 5;
console.log('mutable state:', areaImpureOuterState(rect));
rect.width = 5;
console.log('mutable state:', areaImpureOuterState(rect));

纯函数的硬性规则是,如果我给你相同的输入,无论程序其余部分的状态如何,它都会总是给我相同的输出,并且< em>不直接改变程序的状态。

因此,您可以像这样重写您的 test 函数,使其几乎纯净:

function test(obj) {
    if (obj.order.owner && obj.selectedEvent()) {
        return true;
    }
    else if(obj.order.booking_id == '4000' || !obj.isValid(obj.order.order_id) ){
        return false;
    }
    return obj.whatever;
};

它有一个问题:obj.selectedEvent() 是一个不纯函数,它污染了这个纯函数。

关于javascript - 纯函数 vs 面向对象 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38017795/

相关文章:

javascript - 如何在 JavaScript 中使用正则表达式?

javascript 在我的 HTML 页面上显示为文本

javascript - 检测 FLASH 插件崩溃

javascript - 如何从 web sql 将值放入选择框中

javascript - 如何在javascript中反转值

javascript - 使用 X 关闭 Chrome 应用程序时 onClosed() 不会触发

javascript - 解析解三次方程的函数

javascript - 如何单击一次同时更改文本和图标

JavaScript Promises - 创建一组要一起执行的 promise

javascript - 如何创建模式登录弹出窗口?