I think it depends on whether your definition of OOP is that it uses a message-passing style. Pure functions don't have to mutate anything because they return values which you can store in new variables. var brandNewVariable = pureFunction(foo); With message passing style, you tell an object to store new data instead of asking it what new data you should store in a new variable. sameOldObject.changeMe(foo); It's possible to have objects and not mutate them, by making its methods pure functions that happen to live on the inside of the object instead of outside. var brandNewVariable = nonMutatingObject.askMe(foo); But it's not possible to mix message passing style and immutable objects.