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