Gee*_*eek 23 javascript closures free-variable
Javascript闭包定义说:
"闭包"是一个表达式(通常是一个函数),它可以将自由变量与绑定这些变量的环境("关闭"表达式)结合在一起.
有人可以向我解释自由变量的概念吗?这个概念是Javascript特定还是适用于其他语言?
Den*_*ret 27
自由变量只是既未在本地声明也未作为参数传递的变量.
在计算机编程中,术语自由变量是指函数中使用的变量,它们不是局部变量,也不是该函数的参数.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);
...
};
Run Code Online (Sandbox Code Playgroud)
在此示例中,闭包从setDim函数指向_this封闭范围(_ensureInit函数)中声明的变量.此变量未声明setDim或传递.这是一个"自由变量".
注意,_this它不会成为函数的变量setDim:在同一范围内声明的另一个函数将共享同一个变量.
“免费翻译”可以是:"out of scope" - variables.
由于 ECMAscript 使用词法作用域,自由变量是在父作用域中定义并通过作用域链搜索进行查找的变量。
(function _outerScope() {
var foo = 42;
(function _innerScope() {
var bar = 100;
console.log( foo + bar ); // 142
}());
}());
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,foo是上下文中的自由变量_innerScope。如果我们快速浏览一下 ECMAscript 的基本概念,就会变得非常明显。
甲上下文链接到激活对象(在ES3),分别一个词汇环境记录(在ES5),其中包含像的东西:function declarations,variables declared with var和formal paramters,以及对所有的参考父激活对象/词法环境。如果需要访问变量,ECMAscript 引擎将首先从当前上下文本身查看AO / LE;如果在那里找不到它,它会查看父AO的 / LE。
由于任何Context 都将这些数据存储在类似数组的结构中(不要忘记我们在这里讨论的是实现级别,而不是 Javascript 本身),因此我们讨论的是Lexical Scope,因为我们按顺序搜索所有父Context。