zoukankan      html  css  js  c++  java
  • JavaScript的apply、call以及arguments对象

    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访问参数列表只能通过索引,而不能通过参数标识符(即参数名)。

  • 相关阅读:
    start pyhton project(2)
    java.lang.ClassFormatError: Truncated class file
    linux 查看计算机信息命令
    VS2010UltimTrialCHS 版注册码
    VS2008打包安装程序,实现覆盖安装设置
    WPF移动不规则渐变色窗体
    C#下移动无边框窗体(直接粘贴可用)
    TCP通信过程中时时监测连接是否已断开
    WIN7下使用DotNetBar,关闭Aero效果,使用Office2007Form皮肤
    【原创】企业级工作流管理系统评价依据或标准
  • 原文地址:https://www.cnblogs.com/feichexia/p/2541975.html
Copyright © 2011-2022 走看看