鍍金池/ 問答/數(shù)據(jù)庫  HTML/ JS中活躍對象(Active Object)的函數(shù)參數(shù),到底是根據(jù)形參還是實參生

JS中活躍對象(Active Object)的函數(shù)參數(shù),到底是根據(jù)形參還是實參生成?

JavaScript中函數(shù)的變量對象,即活躍對象(Active Object)AO,在創(chuàng)建并初始化時,到底是根據(jù)函數(shù)的形參來生成屬性,還是根據(jù)實參來生成屬性呢?

說法1,根據(jù)形參來生成,深入理解JavaScript執(zhí)行上下文、函數(shù)堆棧、提升的概念

函數(shù)的形參(當進入函數(shù)執(zhí)行上下文時) —— 變量對象的一個屬性,其屬性名就是形參的名字,其值就是實參的值;對于沒有傳遞的參數(shù),其值為undefined

說法2,根據(jù)實參來生成,深入理解JavaScript系列(12):變量對象(Variable Object)

活動對象是在進入函數(shù)上下文時刻被創(chuàng)建的,它通過函數(shù)的arguments屬性初始化。arguments屬性的值是Arguments對象:

這就讓人很困惑了。

有代碼:

var a=1.2,b={},c="hello";
function sumOf(x,y){
   var tmp=x+y;
   console.log(tmp);
}
sumOf(a,b,c);

我按照兩種說法各自書寫一下生成的變量對象,如果有什么錯誤,請指出。

在進入函數(shù)sumOf的可執(zhí)行代碼時,創(chuàng)建活躍對象并初始化:
說法1:根據(jù)形參
AO_sumOf = {
x:1.2,
y:{},
// 實參c被丟棄,但可以通過sumOf.arguments[2]訪問到。
tmp:undefined
}
說法2:根據(jù)實參
AO_sumOf = {
x:arguments[0],
y:arguments[1],
arguments[2]:arguments[2]; // 可以看到,如果以實參生成屬性,屬性名會是個問題
tmp:undefined
}

我是比較偏向于以形參生成屬性值的說法,但即使在說法1的原文中也提到了用arguments對象來初始化參數(shù),這就讓我搞不懂了。
圖片描述

回答
編輯回答
筱饞貓

ECMAScript 3規(guī)范 - 10.1.3 Variable Instantiation

for each formal parameter(注:形參), as defined in the FormalParameterList, create a property of the variable object whose name is the Identifier and whose attributes are determined by the type of code.

然而這是 ES3 的規(guī)范,ES5+ 用的不是這一套了好像。
ECMAScript 5規(guī)范 10.6、10.4.3、13.2.1 應(yīng)該是這三塊,然鵝我看不太懂。。。

2017年3月21日 08:11
編輯回答
撿肥皂

我個人偏向說法1

AO = {
    arguments: { 0: 1.2, 1: reference to b, 2: 'hello', length: 3 },
    x: 1,
    y: reference to b,
    tmp: undefined
}
2017年8月28日 05:43