2009-11-06 53 views
1

考慮下面的代碼在哪裏定義了arguments屬性?

function add(x, y) { 
    alert(arguments.length); 
    var total = x + y; 
    return total; 
} 
add(); // NaN alerts 0 
add(2,3); // 5 alerts 2 
add(3,3,5); //6 alerts 3 

哪裏是參數定義?它是如何在我的add函數中可用的?

回答

1

就是說的Javascript的只是一個標準功能。無論何時調用任何函數,都會自動添加一個自變量數組添加到本地作用域。這允許函數從調用者接收變量或未知量的參數,並根據需要動態使用這些參數。

通常,當一個函數被作爲一個包裝器放在另一個包裝器中時,其中的確切參數是未知的,並且對包裝器是任意的,它們只是執行一個動作,然後將提供的參數直接傳遞給包裝函數。

3

arguments對象是如何創建的,當和大約的詳細說明:

從ECMAScript的specification

10.1.8參數對象

當控制進入用於功能代碼的執行上下文,將創建一個參數對象並將其初始化如下:

  • 參數對象的內部[[Prototype]]屬性的值是原始對象原型對象,即初始值Object.prototype(參見15.2.3.1)。

  • 以名稱callee和屬性{ DontEnum }創建了一個屬性。此屬性的初始值是正在執行的Function對象。這允許匿名函數遞歸。

  • 以名稱length和屬性{ DontEnum }創建屬性。該屬性的初始值是調用者提供的實際參數值的數量。

  • 對於每個非負整數,arg,小於length屬性的值,屬性與名稱ToString(arg)和屬性的屬性{ DontEnum }創建。該屬性的初始值是調用者提供的相應實際參數的值。第一個實際參數值對應於arg = 0,第二個對應於arg = 1,依此類推。在arg小於Function對象的形式參數數量的情況下,此屬性與激活對象的相應屬性共享其值。這意味着更改此屬性會更改激活對象的相應屬性,反之亦然。