Что такое свободные переменные?
Определение закрытия Javascript говорит:
"Закрытие" - это выражение (обычно функция), которое может иметь свободный переменные вместе со средой, которая связывает эти переменные (что "закрывает" выражение).
Может кто-нибудь объяснить мне понятие свободных переменных? Является ли эта концепция Javascript конкретной или относится к другим языкам также?
Ответы
Ответ 1
Свободные переменные - это просто переменные, которые не объявлены ни локально, ни переданы как параметр.
Источник:
В компьютерном программировании термин "свободная переменная" относится к переменным используемые в функции, которые не являются локальными переменными, ни параметры этого function 1 Термин нелокальная переменная часто является синонимом в этом контекст.
В закрытии javascript это просто переменные, которые выполняет функция (чтение и запись) в охватывающей области, где объявлено закрытие или в родительской области.
Посмотрите на этот реальный пример:
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);
...
};
В этом примере точки замыкания от функции setDim
к переменной _this
, объявленной в охватывающей области (функция _ensureInit
). Эта переменная не объявляется в setDim
и не передается. Это "свободная переменная".
Обратите внимание, что _this
не становится переменной функции setDim
: другая функция, объявленная в той же области действия, будет иметь одну и ту же переменную.
Ответ 2
В качестве примера:
var myModule = (function (){
var moduleVar; // closure variable
return function(){
// actual function
}
})();
указанная переменная имеет переменную замыкания. он может использоваться по всему закрытию, но не является частью глобального пространства имен.
Ответ 3
"Свободный перевод" может быть: "out of scope" - variables
.
Так как ECMAscript использует лексическую область видимости, свободная переменная является переменной, которая была определена в родительской области и получает поиск по цепочке поиска по цепочке.
(function _outerScope() {
var foo = 42;
(function _innerScope() {
var bar = 100;
console.log( foo + bar ); // 142
}());
}());
В приведенном выше примере foo
является свободной переменной в контексте _innerScope
. это становится очень очевидным, если мы быстро взглянем на основные концепции ECMAscript.
Контекст связан с объектом активации (в ES3), соответственно, с лексической защитой (в ES5), которая содержит такие вещи, как: function declarations
, variables declared with var
и formal paramters
, а также ссылка на все родительские объекты активации/лексические среды. Если нужно получить переменную, механизм ECMAscript сначала будет изучать AO/LE из текущего контекста; если он не может быть найден там, он смотрит в родительский AO/LE.
Так как любой Контекст сохраняет эти данные в подобной массиву структуре (не забывайте, что мы говорим об уровне реализации здесь, а не о самом Javascript), мы говорим о Lexical Scope
, потому что мы просматриваем все родительские Контексты в порядок.