JS 中 arguments 的理解與用法

在 JavaScript 中,一切都是對象,連函數也是對象,函數名其實是引用函數定義對象的變量。

arguments 是對象的一個特殊屬性,是所在函數的一個內置類數組對象
arguments 對象就像數組,但是它卻不是數組。以數組的形式保存了調用方給該函數傳入的所有參數。

屬性:
length:獲取arguments對象的長度,即傳入參數的個數
callee: 引用當前正在執行的函數
可以通過數組下標 arguments[i] 來訪問數組中的每個元素

用法:
1)利用 argument[i] 訪問函數參數
在 js 中,不需要明確指出參數名,就能訪問它們,即可以訪問隱藏的參數

function useArguments() {
  var sum = 0;
  for(var i = 0; i < arguments.length; i++){
      sum += arguments[i];
  }
  return sum;
}

2)利用 arguments.length 返回參數的個數
arguments.length 代表着實參的個數。
3)利用 arguments.callee 可以使匿名函數調用自身
callee 屬性的初始值就是正被執行的 Function 對象,這允許匿名的遞歸函數。
在使用函數遞歸調用時推薦使用 arguments.callee 代替函數名本身,表示對函數對象本身的引用

var sum = function (n) {
        if (1 == n) {
            return 1;
        } else {
            return n + arguments.callee(n - 1);
        }
}
alert(sum(6));

4)利用 arguments 對象對函數進行模擬重載
js 語法不支持重載。但可用 arguments對象模擬重載效果。

重載:是指函數的方法名相同,但參數不同。
例如:

function add(a,b){
    alert(a+b);
}
add(1,2);
function add(c,d,e){
    alert(c+d+e);
}
add(1,2,3);

輸出 NaN 9;因爲後面的函數把前一個同名函數覆蓋掉了。

模擬重載,計算圓形,長方形,三角形周長

function length () {
  if(arguments.length == 1) {
      alert(2*3.14 * arguments[0]);
  } else if(arguments.length == 2) {
      alert(2*(arguments[0] + arguments[1]));
  } else if(arguments.length == 3) {
      alert(arguments[0] + arguments[1] + arguments[2]);
  } else {
      return null;
  }
}
length(1);//6.28
length(3,4);//14
length(3,4,5);//12

可以使用 Array.prototype.slice.call(arguments) 把arguments類數組轉化爲數組,就可以使用數組的方法了。

function useArguments() { 
      var arr = Array.prototype.slice.call(arguments); 
      var sum = 0; 
      arr.forEach(function(value){ 
              sum += value; 
      }); 
      return sum; 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章