javascript - unica - ¿Qué son las variables libres?
que son variables libres (3)
Definición de cierre de Javascript dice:
Un "cierre" es una expresión (normalmente una función) que puede tener variables libres junto con un entorno que vincula esas variables (que "cierra" la expresión).
¿Alguien puede explicarme el concepto de variables libres? ¿Es este concepto de Javascript específico o se aplica a otros idiomas también?
Como ejemplo:
var myModule = (function (){
var moduleVar; // closure variable
return function(){
// actual function
}
})();
La variable definida allí es una variable de cierre. Se puede utilizar en todo el cierre, pero no forma parte de un espacio de nombres global.
Las variables libres son simplemente las variables que no se declaran localmente ni se pasan como parámetros.
En la programación de computadoras, el término variable libre se refiere a las variables utilizadas en una función que no son variables locales ni parámetros de esa función. 1 El término variable no local es a menudo un sinónimo en este contexto.
En los cierres de javascript, esas son simplemente las variables que toma la función (lectura y escritura) en el ámbito de cierre donde se declara el cierre o en un ámbito principal.
Mira este ejemplo del mundo real:
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);
...
};
En este ejemplo, un cierre apunta desde la función setDim
hacia la variable _this
declarada en el ámbito adjunto (la función _ensureInit
). Esta variable no se declara en setDim
ni se pasa. Es una "variable libre" .
Tenga en cuenta que _this
no se convierte en una variable de la función setDim
: otra función declarada en el mismo ámbito compartiría la misma variable.
Una "traducción libre" podría ser: "out of scope" - variables
.
Dado que ECMAscript utiliza el alcance léxico, una variable libre es una variable que se definió en un ámbito principal y se busca mediante una búsqueda de alcance de cadena.
(function _outerScope() {
var foo = 42;
(function _innerScope() {
var bar = 100;
console.log( foo + bar ); // 142
}());
}());
En el ejemplo anterior, foo
es una variable libre dentro del contexto de _innerScope
. se vuelve muy obvio si echamos un vistazo rápido a los conceptos subyacentes de ECMAscript.
Un contexto está vinculado a un objeto de activación (en ES3), respectivamente un registro de entorno léxico (en ES5), que contiene elementos como: function declarations
, variables declared with var
y formal paramters
, así como una referencia a todos los objetos de activación principales / Entornos léxicos . Si es necesario acceder a una variable, el motor de ECMAscript buscará primero en los AO / LE desde el Contexto actual; si no se puede encontrar allí, busca en los AO / LE de los padres.
Dado que cualquier Contexto almacena estos datos en una estructura similar a una matriz (no olvide que estamos hablando de nivel de implementación aquí, no de Javascript), estamos hablando de Lexical Scope
, porque buscamos en orden todos los Contextos principales.