什么是自由变量?
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 declarations
, variables declared with var
和formal paramters
function declarations
variables declared with var
,以及对所有父激活对象/词汇环境。 如果需要访问变量,ECMAscript引擎将首先从当前上下文本身查看AOs / LE; 如果在那里找不到,它会查看父AO的/ LE的。
由于任何Context都将这些数据存储在类似数组的结构中(不要忘记我们正在讨论实现级别,而不是Javascript本身),所以我们在讨论Lexical Scope
,因为我们按顺序搜索所有父上下文。