Call by value is a way to pass arguments to subroutines in which the value itself is copied. As a consequence, any modification to the value within the subroutine will not be preserved after the subroutine terminates; this is cleaner in the sense that it leads to a slightly more declarative style of programming.

Call by reference, however, is less work if values can be large. Call by value return is just fun. And call by name is amazing.