函数 - 理解参数
?
ECMAScript函數的參數與大多數其他語言中的函數參數有所不同。ECMAScript函數不介意傳遞進來多少個參數,也不在乎傳進來參數是什么數據類型,也就是說,即使你定義的函數只接收兩個參數,在調用這個函數時也未必一定要傳遞兩個參數。可以傳遞一個,三個甚至不傳遞參數,而解析器永遠不會有什么怨言,之所以會這樣,原因是ECMAScript中的參數在內部是用一個數組來表示的。函數接收到的始終都是這個數組,而不關心數組中包含哪些參數(如果有參數的話)。如果這個數組中不包含任何元素,無所謂;如果包含多個元素,也沒問題。實際上,在函數體內可以通過arguments對象來訪問這個參數數組,從而獲取傳遞參數的每一個參數。
其實,arguments對象只是數組類似(它并不是Array實例),因為可以使用方括號語法訪問它的一個元素(即第一個元素是arguments[0],第二個元素是argument[1],以此類推),使用length屬性來確定傳遞進來多少個參數。在前面的例子中,sayHi()函數的第一個參數的名字叫name,而該參數的值也可以通過訪問arguments[0]來獲取。因此,那個函數也可以像下面這樣重寫,即不顯式地使用命名參數:
function sayHi(){alert("hello"+arguments[0]+","+arguments[1]); }這個重寫后的函數中不包含命名的參數。雖然沒有使用name和message標識符,但函數的功能依舊。這個事實說明了ECMAScript函數的一個重要特點:命名參數只提供便利,但不是必須的。另外,在命名參數方面,其他語言可能事先創建一個函數簽名,而將來的調用必須與該簽名一致。但在ECMAScript中,沒有這些條條框框,解析器不會驗證命名參數。
通過訪問arguments對象的length屬性可以獲知有多少個參數傳遞給了函數。下面這個函數會在每次被調用的時,輸出傳入其中的參數個數:
function howManyArgs(){alert(arguments.length); } howManyArgs("string",45)//2 howManyArgs();//0 howManyArgs(12)//1執行以上代碼會依次出現3個彈出框,分別顯示2,0和1。由此可見,開發人員可以利用這一點讓函數能夠接收任意個參數并分別實現適當的功能。請看下面例子:
?
關于arguments的行為,還有一點比較有意思。那就是它的值永遠與對應命名參數的值保持同步。例如:
function doAdd(num1,num2){arguments[1]=10;alert(arguments[0]+num2); }每次執行這個doAdd()函數都會重寫第二個參數,將第二個參數的值修改為10。因為arguments對象中的值會自動反映到對應的命名函數,所以修改arguments[1],也就修改了num2,結果他們的值都會變成10。不過,這并不是說讀取這兩個值會訪問相同的內存空間;它們的內存空間是獨立的,另外還要記住,如果只傳人了一個參數,那么為arguments[1]設置的值不會反應到命名參數中。這是因為arguments對象的長度是由傳人的參數決定的,不是由定義函數時的命名參數決定的。
關于參數還要記住最后一點:如果沒有傳遞值的命名參數將自動被賦予undefined值。這就跟定義了變量但又沒有初始化一樣。例如,如果只給doAdd()函數傳遞了一個參數,則num2中就會保存undefined只值。
嚴格模式對如果使用arguments對象做出了一些限制。首先,像2前面例子中那樣的賦值會變得無效。也就是說,即使arguments[1]設置為10,num2的值仍然還是undefined。其次,從寫arguments的值會導致語法錯誤(代碼將不會執行)。
轉載于:https://www.cnblogs.com/onedaythreeeat/p/4543624.html
總結
- 上一篇: HDOJ acm steps 3.1
- 下一篇: 测试Servlet生命周期例子程序