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 4
add(3, 4, 5); // 输出 3 4 5

function add2() {
    for(var v in arguments) { // v是参数索引,从0开始
      console.log(arguments[v]); 
   } 
}
add2(3, 4); // 输出 3 4
add2(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访问参数列表只能通过索引,而不能通过参数标识符(即参数名)。

posted on 2012-06-08 16:30  feichexia  阅读(1695)  评论(0编辑  收藏  举报