Can we say that closures converts pass by reference to pass by value? :P
Also look at let and var. let does block level scoping whereas var does function level scoping. let is more intuitive. as you would consider block scoping in a loop for example.
look at IIFC immediately invoked function calls.
Understanding and separating out function definition and invocation in different things makes the understanding of this much easier.