2011-06-13 61 views
20

術語「激活對象」是「變量對象」的另一個名稱還是實際上它們之間有任何區別?我一直在閱讀一些關於如何在執行上下文中形成變量作用域的JavaScript文章,並且從我的角度來看,似乎在大多數文章中他們可以交替使用這兩個術語。JavaScript中的激活和變量對象?

+1

我從來沒有聽說過「變量對象」的。你從哪裏得到這個指定? – Zecc 2011-06-13 23:09:07

+3

Zecc - ES3§10.1.3變量Instatiation:「每個執行上下文都與它關聯一個變量對象。」 ES5將其稱爲*變量環境*(ES5§10.3,表19),措辭不同但實際上是相同的事情:*創建執行上下文時,其詞法環境和變量環境組件最初具有相同的值* – RobG 2011-06-14 01:19:44

回答

17

嗯,我剛剛學到了一些東西:)。從this article,它會出現一個函數的執行上下文內,激活對象被用作可變對象:

當執行上下文中創建了一些事情發生在限定的順序。首先,在函數的執行上下文中創建一個「激活」對象。

然後,「變量實例化」過程使用ECMA 262引用爲「變量」對象的對象進行。但是,Activation對象用作Variable對象(請注意,這很重要:它們是同一個對象)。爲每個函數的形式參數創建Variable對象的命名屬性,如果函數調用的參數與這些參數相對應,則將這些參數的值分配給屬性(否則分配的值未定義)。

但是,當您在全球範圍內的時候,沒有一個激活對象,因此全局對象作爲變量對象,而不是:

全球執行環境得到了一些輕微不同的處理,因爲它沒有參數,所以它不需要定義的Activation對象來引用它們。 [...]全局對象用作Variable對象,這就是爲什麼全局聲明的函數成爲全局對象的屬性。

所以它聽起來像「激活對象」和「變量對象」是一個函數上下文中的同一事物,但不是在全局上下文中。

+4

+1理查德康福德的文章。請注意,它是在ES5之前編寫的,因此需要稍微更新。 ECMA-262的相關部分是§10.4.1,它討論了* VariableEnvironment *和* LexicalEnvironment *而不是變量對象和激活對象。 – RobG 2011-06-14 01:14:57

+0

啊我一直懷疑他們是一樣的..我很確定激活對象是從變量對象繼承的。有人願意證實嗎? – 2011-06-14 01:20:26

+0

是的,它們是從變量對象繼承而來的。事實上它們都是一樣的。 – Thalaivar 2012-12-29 01:25:01

7

一種激活對象處於範圍鏈與最下面爲全局對象最上面的對象。 鑑於可變對象是抽象的概念,因此,根據其執行上下文,是在範圍鏈任何鏈路包括激活/全局對象


它包含:

  • 所有變量和函數你的函數體內聲明;
  • 由函數簽名指定的名爲的參數;
  • 參數作爲對象名爲arguments(如果您希望您的函數支持多個簽名)。

它不包含:

  • this(因爲它不是一個變量);
  • 命名函數表達式

另外信息 - JavaScript. The core.

很少引號TL的情況下;博士

可變對象是數據的範圍與執行相關上下文。這是一個特殊對象與上下文相關聯,其中存儲變量和函數聲明正在上下文中定義。

A 變量對象抽象概念。在不同的上下文類型中,物理上,它使用不同的對象來呈現。

[..]在全球範圍內的可變對象全局對象本身[..]

[..]的函數的可變對象是相同的簡單可變對象 ,但除了變量函數聲明,它還存儲形式參數arguments對象,被稱爲ACTIVA對象

[..]在一個代碼訪問this時,它的值被直接從執行上下文採取無任何範圍鏈查找。

+0

您可以向我們展示每種情況下的一些源代碼嗎? – 2014-01-24 05:09:33

0

它更準確的說,一個激活對象的類型是可變的對象。這與一個人是如何成爲一種人類相似。如上所述here,術語「可變對象」只是用來描述認爲描述當前正在執行上下文的環境和範圍的性質的任何對象廣義術語。

因此,全局執行上下文(即,外部的任何函數)內,它最終被全局對象。爲什麼?因爲它是保存描述全局執行上下文的環境和範圍的屬性的對象。

儘管在函數本地執行上下文中(即函數內),它是變量對象的函數本地對象(也稱爲激活對象),因爲它是保存描述環境的屬性的對象,以及當前正在執行的功能的範圍。例如函數參數等屬性。