The only effect of evaluating a function is its return value and the only thing that affects the return value of a function is its arguments.

square = int pow(int i, 2);

square becomes a shortcut to pow with 2 as second argument

String s1 = somewhatLongOperation1();

// other operations

String s2 = somewhatLongOperation2();

// other operations

 String s3 = concatenate(s1, s2);

s1 and s2 will not be run until they are required by concatenate()

We can define new control structures, because the arguments are not evaluated until the compiler really needs them:

void unless(boolean condition, List code) {

    if(!condition)

        code;

}

System.out.println("Please enter your name: ");

System.in.readLine();

To be sure that the first line is executed before the second one, we force a dependency:

System.out.println("Please enter your name: ", System.in.readLine);

With Continuation Passing Style, you force a function to become an argument to another  function, and ask the calling function to return to it.

int fib(0) {

    return 1;

}

int fib(1) {

    return 1;

}

int fib(int n) {

    return fib(n - 2) + fib(n - 1);

}

When a closure references a variable that's not in its local scope, it consults this reference for a parent scope.  Closures bring functional and OO worlds closer together.

A closure is just an object that creates "member variables" on the fly by grabbing them from the scope