Can we say only global variables are the free variables?
No.
Counterexample in ECMAScript:
function outerFn() {
const outerVar = "Outer";
function innerFn() {
return outerVar;
}
// Could also be written:
const innerFn2 = () => outerVar;
return innerFn();
}
console.log(outerFn());
Counterexample in Python:
def outer_fn():
outer_var = "Outer"
def inner_fn():
return outer_var
return inner_fn()
print(outer_fn())
Counterexample in Ruby:
def outer_method
outer_var = "Outer"
inner_lambda = -> () { outer_var }
inner_lambda.()
end
puts outer_method
Counterexample in Scala:
def outerMethod =
val outerVar = "Outer"
def innerFn = outerVar
innerFn
println(outerMethod)
Counterexample in Java:
public class FreeVariablesInJava {
static String outerMethod() {
var outerVar = "Outer";
java.util.function.Supplier<String> innerFn = () -> outerVar;
return innerFn.get();
}
public static void main(String args[]) {
System.out.println(outerMethod());
}
}