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訪問參數列表只能通過索引,而不能通過參數標識符(即參數名)。