Javascript closure definition says :
A "closure" is an expression (typically a function) that can have free variables together with an environment that binds those variables (that "closes" the expression).
Can some one explain to me the concept of free variables ? Is this concept Javascript specific or applies to other languages also ?
In computer programming, the term free variable refers to variables used in a function that are neither local variables nor parameters of that function. The term non-local variable is often a synonym in this context.
Free and Basic Variables. A variable is a basic variable if it corresponds to a pivot column. Otherwise, the variable is known as a free variable. In order to determine which variables are basic and which are free, it is necessary to row reduce the augmented matrix to echelon form.
basic variable: any variable that corresponds to a pivot column in the augmented matrix of a system. free variable: all nonbasic variables.
A variable is free in a formula if it occurs at least once in the formula without being introduced by one of the phrases “for some x” or “for all x.” Henceforth, a formula S in which x occurs as a free variable will be called “a condition…
Free variables are simply the variables that are neither locally declared nor passed as parameter.
Source :
In computer programming, the term free variable refers to variables used in a function that are not local variables nor parameters of that function.1 The term non-local variable is often a synonym in this context.
In javascript closures, those are simply the variables that the function takes (read and write) in the enclosing scope where is declared the closure or in a parent scope.
Look at this real world example :
Gol.prototype._ensureInit = function() { ... var _this = this; var setDim = function() { _this.w = _this.canvas.clientWidth; _this.h = _this.canvas.clientHeight; _this.canvas.width = _this.w; _this.canvas.height = _this.h; _this.dimChanged = true; _this.draw(); }; setDim(); window.addEventListener('resize', setDim); ... };
In this example a closure points from the setDim
function towards the variable _this
declared in the enclosing scope (the _ensureInit
function). This variable isn't declared in setDim
nor passed. It's a "free variable".
Note that _this
doesn't become a variable of the function setDim
: another function declared in the same scope would share the same variable.
A "free-translation" could be: "out of scope" - variables
.
Since ECMAscript uses lexical scoping, a free variable is a variable which was defined in a parent-scope and gets looked-up by a scope-chain search.
(function _outerScope() { var foo = 42; (function _innerScope() { var bar = 100; console.log( foo + bar ); // 142 }()); }());
In the above example, foo
is a free variable within the context of _innerScope
. it becomes very obvious if we have a quick glance into the underlying concepts of ECMAscript.
A Context is linked to an Activation Object (in ES3), respectively a Lexical Enviroment Record (in ES5), which contains things like: function declarations
, variables declared with var
and formal paramters
, as well as a reference to all parent Activation Objects / Lexical Environments. If a variable needs to be accessed, the ECMAscript engine will first look into the AOs / LEs from the current Context itself; if it can't be found there, it looks into the parent AO's / LE's.
Since any Context stores this data in an array-like structure (don't forget we're talking about implementation level here, not Javascript itself), we are talking about Lexical Scope
, because we search through all parent Contexts in order.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With