函數參數arguments共享問題

###函數參數arguments共享問題
在JavaScript中,傳進來的函數參數可以用函數上下文裏的內部對象arguments訪問[^footnote].。它包括如下屬性:
: callee:指向當前函數的引用,
: length : 實際傳遞進來的參數的個數
: properties-indexes (字符串類型的整數) 屬性的值就是函數的參數值(按參數列表從左到右排列)。 properties-indexes內部元素的個數等於arguments.length. properties-indexes 的值和實際傳遞進來的參數之間是共享的
> 所以,我們一般通過arguments[0]這種形式可以訪問到傳進來函數的參數值,實際上是通過arguments的properties-indexes屬性來訪問。根據properties-indexes屬性的定義,arguments[0]這種訪問函數參數的方式只能和實際有傳進來的參數共享,對於那些函數聲明定義裏面存在卻在函數執行時未真正傳進來的參數,不能與arguments[0]這種方式共享。

<html>
<body>
<script type="text/javascript">
function foo(x, y, z) {
  console.log("[x]"+x);//[x] 10
  arguments[0] = 450;
  console.log("[x]"+x);//[x] 450
  console.log(y); // undefined
  y = 30;
  arguments[1] = 50;
  console.log(y); // 30
}
foo(10);
</script>
</body>
</html>

在上面代碼中我們看到,我們在函數中傳進來一個參數x的值,在函數內部通過arguments[0]這種方式去改變函數參數的值,只有對x的改變生效,當使用 arguments[1]的方式去改變y的值,發現改變後不能和y共享。
注意,在嚴格模式下,x的值將始終爲10


剛開始瞭解學習ecmascript規範相關的新人
[^footnote]: http://dmitrysoshnikov.com/ecmascript/ru-chapter-2-variable-object/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章