gpt4 book ai didi

javascript - 纯函数 vs 面向对象 Javascript

转载 作者:行者123 更新时间:2023-12-03 06:39:49 27 4
gpt4 key购买 nike

阅读后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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com