javascript arguments(轉)

什麼是arguments

arguments 是是JavaScript裏的一個內置對象,它很古怪,也常常被人所忽視,但其實是很重要的。全部主要的js函數庫都利用了arguments對象。因此agruments對象對於javascript程序員來講是必需熟悉的。javascript

全部的函數都有屬於本身的一個arguments對象,它包括了函所要調用的參數。他不是一個數組,若是用typeof arguments,返回的是’object’。雖然咱們能夠用調用數據的方法來調用arguments。好比length,還有index方法。可是數 組的push和pop對象是不適用的。html

建立一個靈活的函數

看起來貌似argument對象使用起來十分有限,可是實際上它是一個很是有用的對象。你能夠經過使用argument對象讓函數可以調用數量不定 的參數。在Dean Edwards的base2庫裏有個格式化的函數,展現了這個靈活性。java

function format(string) {   程序員

  var args = arguments;   數組

  var pattern = new RegExp(「%([1-" + arguments.length + "])」, 」g」);   app

  return String(string).replace(pattern, function(match, index) {   函數

    return args[index];   spa

  });   prototype

}; code

咱們提供了一個模板字符串,你能夠用」%1」到「%9」給返回值添加一個佔位符。而後提供給九個其餘參數插入。

format(「And the %1 want to know whose %2 you %3″, 」papers」, 」shirt」, 」wear」);

上面的代碼將返回:And the papers want to know whose shirt you wear" .

有件事情咱們須要注意下,在定義函數的時候,咱們只規定了一個參數,string。Javascript容許咱們傳遞任何數量的參數到一個函數裏,無論怎麼定義這個函數。Arguments對象對這些都是容許的。

把arguments對象轉換成一個真正的數組

雖然arguments對象不是一個真正的javascript數組,可是咱們仍是能夠輕易的把它轉換成標準的數據 ,而後進行數組操做。

var args = Array.prototype.slice.call(arguments); 

那麼如今這個變量args就含有一個含有函數全部參數的標準javascript數組對象。

經過預置的arguments對象建立函數

Arguments對象容許咱們去執行全部類型的javascript方法。這邊附上一個makeFunc函數的定義。這個函數容許咱們去提供一個函數引用和這個函數的全部參數。他將返回一個匿名函數去調用你規定的函數,也提供了匿名函數調用時所附帶的參數。

function makeFunc() {   

  var args = Array.prototype.slice.call(arguments);   

  var func = args.shift();   

  return function() {   

    return func.apply(null, args.concat(Array.prototype.slice.call(arguments)));   

  };   

}

第一個argument對象給makeFunc提供了你想調用的函數的引用。他是從arguments數組裏移除的。而後makeFunc返回了一個匿名函數去運行規定的方法。

第一個應用的argument指向了函數調用的範圍,主要是函數內部關鍵部分所指向的。咱們先保持這個爲null。第二個arguments是一個 數組,會爲這個函數轉變爲arguments對象。makeFunc把原始的數組值串聯到arguments對象裏提供給匿名函數和所調用函數的數組。

你須要輸出一個模板老是相同的位置,這樣就能夠不用老是在每次引用模板的時候調用format函數。你可使用makeFunc的通用功能去返回能夠調用format而後自動補充模板的函數。

var majorTom = makeFunc(format, 」This is Major Tom to ground control. I’m %1.」);

你能夠像這樣調用majorTom函數:

majorTom(「stepping through the door」);   

majorTom(「floating in a most peculiar way」);

每一次你調用majorTom,它會同時調用format函數和第一個argument,已經寫好的模板。那麼將返回

「This is Major Tom to ground control. I’m stepping through the door.」   

「This is Major Tom to ground control. I’m floating in a most peculiar way.」

建立引用自身的函數

你可能以爲這樣很酷,不過,arguments還有更多的驚喜。他還有其餘有用的特性:callee方法 。Arguments.callee包括了一個函數的引用去建立一個argument對象。那麼該如何使用呢?

Arguments.callee方法能讓一個匿名函數很方便的指向自己。

Repeat是一個承載了一個函數引用和兩個數字的函數。第一個數字是函數調用幾回,第二個數字是每一個調用的間隔時間,單位是毫秒。

function repeat(fn, times, delay) {   

  return function() {   

    if(times– > 0) {   

      fn.apply(null, arguments);   

      var args = Array.prototype.slice.call(arguments);   

      var self = arguments.callee;   

      setTimeout(function(){self.apply(null,args)}, delay);   

    }   

  };   

}  

Repeat函數使用了arguments.callee方法從變量self去獲取一個引用,指向運行原始指令的函數。這樣,匿名函數就能夠再次調用自己。

我有一段超級簡介的函數,承載了一個字符串和執行alert方法。

function comms(s) {   

  alert(s);   

}  

然而,我想建立一個特殊的版本,經過這個版本我能夠重複這個動做三次,每次間隔2秒鐘。那麼,咱們能夠

var somethingWrong = repeat(comms, 3, 2000);   

somethingWrong(「Can you hear me, major tom?」); 

調用了somethingWrong函數的結果就是復這個動做三次,每次alert間隔2秒鐘。

Arguments雖然不是常常用到,有點古怪,可是,它充滿了驚喜,很是值得咱們去了解 。

 原文地址:arguments : A JavaScript Oddity

出處:http://www.cnblogs.com/Fskjb/archive/2011/10/27/2227111.html

相關文章
相關標籤/搜索