的Javascript閉合定義表示:什麼是自由變量?
A「閉合」是可以與結合這些變量 (即「封閉」的表述)的環境中具有自由 變量一起表達(通常是功能)。
有人可以向我解釋自由變量的概念嗎?這個概念是Javascript的特定還是適用於其他語言?
的Javascript閉合定義表示:什麼是自由變量?
A「閉合」是可以與結合這些變量 (即「封閉」的表述)的環境中具有自由 變量一起表達(通常是功能)。
有人可以向我解釋自由變量的概念嗎?這個概念是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
功能的合點朝着封閉範圍內聲明的變量_this
(該_ensureInit
功能)。該變量未在setDim
中聲明,也未通過。這是一個「自由變量」。
請注意,_this
不會成爲函數setDim
的變量:在同一範圍內聲明的另一個函數將共享相同的變量。
「在這種情況下,這些僅僅是函數在聲明閉包的封閉範圍內所需的變量(讀取和寫入)。」不確定你的意思嗎?你能用一個例子來解釋一下,可能嗎? – Geek
@Geek我添加了一個真實世界的例子 –
作爲一個例子:
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
,以及與參考全部父親激活對象/詞彙環境。如果需要訪問某個變量,ECMAscript引擎將首先從當前的上下文本身查看ALE/LE;如果在那裏找不到,它會查看父母AO的/ LE's。
由於任何語境將該數據存儲在陣列狀結構(不要忘記我們在這裏談論的執行層面,不會使用Javascript本身),我們正在談論Lexical Scope
,因爲我們通過所有搜索親本上下文按順序。
自由變量只是一個變量,它不在給定函數內部聲明,而是在其中使用。 –