什么是自由变量?

Javascript关闭定义说:

“闭包”是一个表达式(通常是一个函数),可以将自由变量与一个绑定这些变量的环境(即“关闭”表达式)一起使用。

有人可以向我解释自由变量的概念吗? 这个概念是Javascript的特定还是适用于其他语言?


自由变量只是本地声明或作为参数传递的变量。

资源 :

在计算机编程中,术语自由变量指的是函数中使用的变量,它们不是局部变量,也不是该函数的参数.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函数指向封闭作用域( _ensureInit函数)中声明的变量_this 。 这个变量没有在setDim声明,也没有通过。 这是一个“自由变量”。

请注意, _this不会成为函数setDim的变量:在同一范围内声明的另一个函数将共享相同的变量。


举个例子:

var myModule = (function (){
   var moduleVar; // closure variable

   return function(){
     // actual function
   }
})();

在那里定义的变量是一个闭包变量。 它可以在闭包本身中使用,但不是全局名称空间的一部分。


“自由翻译”可能是: "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 declarationsvariables declared with varformal paramters function declarations variables declared with var ,以及对所有父激活对象/词汇环境。 如果需要访问变量,ECMAscript引擎将首先从当前上下文本身查看AOs / LE; 如果在那里找不到,它会查看父AO的/ LE的。

由于任何Context都将这些数据存储在类似数组的结构中(不要忘记我们正在讨论实现级别,而不是Javascript本身),所以我们在讨论Lexical Scope ,因为我们按顺序搜索所有父上下文。

链接地址: http://www.djcxy.com/p/51499.html

上一篇: What are free variables?

下一篇: Is there a name for this pattern with closures?