JavaScript的apply、call以及arguments對象

來源:互聯網
上載者:User

1、"Methods" are just functions that are assigned to a property of an Object.
   舉例:

var slideshow = function() {init: function() {this.start();},start: function() {},};window.onload = slideshow.init; // 調用this.start()時,this就是window對象

 

2、call和apply功能基本相同,但是差異在於二者的傳參方式,如下(foo是一個函數):

foo.call(obj, arg1, arg2) == foo.apply(obj, arguments)

    即apply第二個參數是一個參數數組。其中obj是調用foo函數的對象。

    根據第一點,在JavaScript中執行某個對象的方法時,此時this指標不一定就是那個對象,而必鬚根據具體是哪個對象正在調用當前方法來確定。

    call和apply正是利用了這點。

 

3、arguments — 另外一種擷取函數參數的靈活方式

   簡單寫了個Demo,如下:

function add(a, b) {    for(var v in arguments) { // v是參數索引,從0開始      console.log(arguments[v]);    } }add(3, 4); // 輸出 3 4add(3, 4, 5); // 輸出 3 4 5function add2() {    for(var v in arguments) { // v是參數索引,從0開始      console.log(arguments[v]);    } }add2(3, 4); // 輸出 3 4add2(3, 4, 5); // 輸出 3, 4 5

   上面可以看出JavaScript的函數參數並沒有嚴格的限制。對於function add(a, b),a、b更多地只是標識該函數有兩個參數,且通過正確命名a、b來增強代碼可讀性。

    即使這樣,我們仍然可以不按照它的要求來傳參數。

    總的來說使用arguments極大地增強了給函數傳參的靈活性。

 

4、arguments的具體應用:

   jQuery的很多API函數都提供了可選項參數(通過諸如{age:'22', sex:'male'}這樣的對象提供),這個的實現就是通過arguments,下面是另外一個簡單的佐證Demo(來自SlideShare.net

 

 function validate() {      var options = {};      var fields = arguments;         // steal slice from Array.prototype      var slice = Array.prototype.slice;         if(typeof fields[fields.length-1] == 'object') {         options = fields[fields.length-1];         fields = slice.call(fields, 0, fields.length-1);      }            console.log("Fields: ");      for(var fKey in fields) {         console.log(fields[fKey]);      }            console.log("Options: ");      for(var oKey in options) {         console.log(options[oKey]);      }   }   validate('name', 'email');  // 沒有配置項   validate('name', 'email', {min: 4, max: 10}); // 有配置項

 

   當然如果要做得更完善,可以提供一個預設配置項對象,這樣當調用方不提供配置項對象時,就使用預設配置項。

   但是注意通過arguments訪問參數列表只能通過索引,而不能通過參數標識符(即參數名)。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.