考慮下面的代碼在哪裏定義了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函數中可用的?
考慮下面的代碼在哪裏定義了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函數中可用的?
就是說的Javascript的只是一個標準功能。無論何時調用任何函數,都會自動添加一個自變量數組添加到本地作用域。這允許函數從調用者接收變量或未知量的參數,並根據需要動態使用這些參數。
通常,當一個函數被作爲一個包裝器放在另一個包裝器中時,其中的確切參數是未知的,並且對包裝器是任意的,它們只是執行一個動作,然後將提供的參數直接傳遞給包裝函數。
arguments
是function
對象的屬性。有關更多信息,請參閱Using the arguments object或Property: Function: arguments。
值得注意的是,arguments
不是一個「真正的」數組,文檔稱它爲「類似數組的對象」 - 更多地在Turning JavaScript's arguments object into an array。
的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
對象的形式參數數量的情況下,此屬性與激活對象的相應屬性共享其值。這意味着更改此屬性會更改激活對象的相應屬性,反之亦然。