Подтвердить что ты не робот

Что такое свободные переменные?

Определение закрытия Javascript говорит:

"Закрытие" - это выражение (обычно функция), которое может иметь свободный переменные вместе со средой, которая связывает эти переменные (что "закрывает" выражение).

Может кто-нибудь объяснить мне понятие свободных переменных? Является ли эта концепция Javascript конкретной или относится к другим языкам также?

4b9b3361

Ответ 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, потому что мы просматриваем все родительские Контексты в порядок.