2012-10-17 220 views
18

的Javascript閉合定義表示:什麼是自由變量?

A「閉合」是可以與結合這些變量 (即「封閉」的表述)的環境中具有自由 變量一起表達(通常是功能)。

有人可以向我解釋自由變量的概念嗎?這個概念是Javascript的特定還是適用於其他語言?

+3

自由變量只是一個變量,它不在給定函數內部聲明,而是在其中使用。 –

回答

22

自由變量只是本地聲明或傳遞參數的變量。

Source :

在計算機編程的,術語自由變量是指變量 在一個功能中使用的不屬於局部變量也不是 函數的參數。 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的變量:在同一範圍內聲明的另一個函數將共享相同的變量。

+0

「在這種情況下,這些僅僅是函數在聲明閉包的封閉範圍內所需的變量(讀取和寫入)。」不確定你的意思嗎?你能用一個例子來解釋一下,可能嗎? – Geek

+0

@Geek我添加了一個真實世界的例子 –

0

作爲一個例子:

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

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

的變量定義有一個封閉的變量。它可以在閉包本身中使用,但不是全局名稱空間的一部分。

0

「自由翻譯」可以是:"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,以及與參考全部父親激活對象/詞彙環境。如果需要訪問某個變量,ECMAscript引擎將首先從當前的上下文本身查看ALE/LE;如果在那裏找不到,它會查看父母AO的/ LE's。

由於任何語境將該數據存儲在陣列狀結構(不要忘記我們在這裏談論的執行層面,不會使用Javascript本身),我們正在談論Lexical Scope,因爲我們通過所有搜索親本上下文按順序。