“Real world language” is a difficult measure for an objective measurement, but I will try, because in the end I also lack the CS-background (EE major here) and a little self-taught; -)
In many languages, a function “sees” more than one “region” (group) of variables - not only its local variables, but also its module or namespace, but also (if it is included in another function) the local variables of the function that contains it.
So for example (in Python, but many other languages work the same!):
def outer(haystack): def inner(needle): eldeen = needle[::-1] return (needle in haystack) or (eldeen in haystack) return [x for x in ['gold','silver','diamond','straw'] if inner(x)]
inner can “see” the haystack without having to consider it as an argument, simply because its containing outer function has the haystack “in scope” (ie, “visible”). So far, I have been so clear, and I hope that this is not the closure, it concerns the lexical scope.
Now suppose that an external function (when processing the language as first-class objects and, in particular, allows them to return as the results of other functions), the external function returns the internal, and not just calling it internally (in Python, this, for example, is what usually happens when you use @something decorator @something ).
How does the inner function (returned as a result) still relate to the outer function variable since the outer function is complete?
The answer is precisely this “closing” business — those variables from an external function that may still need an internal (returned) function are stored and attached as attributes of the returned object of the internal function.