zoukankan      html  css  js  c++  java
  • [置顶] 在js中如何实现方法重载?以及函数的参数问题

     都知道在js中没有办法直接实现方法重载,因为在js中如果定义了多个名称相同,但参数个数不一样的方法,其实只有最后一个方法能被真正调用,其他的方法都被覆盖掉了。

    但每一个函数都有一个特殊的参数arguments,利用它可以实现方法的重载。

    例如:

     function Add(firstnumber,sencondnumber) {   
           return firstnumber+sencondnumber;       
        }


    只能处理两个参数,如果有多个参数,或者没有参数,一个参数的情况都是处理不了的。如果没有传递参数,则firstnumber,sencondnumber都是未定义的,如果传递了一个参数,就相当于只给firstnumber赋值了,sencondnumber依然是未定义。相反如果传递了多于两个的参数,则相当于firstnumber,sencondnumber都赋值了,虽然还有其他的参数,但处理时都忽略掉了。如果能获取其他的参数,自然就可以处理了。此时应该就可以想到函数的特殊参数arguments,这个包含了传递给函数的所有参数,利用它就可以实现方法重载的效果。

    以上的方法修改如下:

     function Add(firstnumber,sencondnumber) {   
           if (arguments.length == 0)//没有传递参数
    	   {
    	     return null;
    	   }
             else if (arguments.length == 1) {//传递的是一个参数
                   return firstnumber;//也可以写为 return arguments[0];
                } 
    			else if(arguments.length == 2)//传递的是两个参数
    			{
    			
    			  return firstnumber+sencondnumber;//也可以写为 return arguments[0]+arguments[1];
    			}
    			
    			else {
                  var total=0;
                    for (var i = 0; i < arguments.length; i++) {
                       total=total+arguments[i]
                    }
    				return total;
                } 
           
        }

     当然这种方法的弊端就是参数的顺序不能打乱,如果函数实现依赖于参数的顺序,就必须进行特殊处理,例如传递null来占位。

    由于传递给函数的参数是严格按照定义函数的顺序给每一个参数赋值的,如果只想给第二个参数赋值,则必须传递两个参数,否则实际上传递的值赋值给了第一个参数,并没有赋值给第二个参数。

    例如只想给sencondnumber传值,但不想给firstnumber传值,必须这样调用Add(null,2)(当然函数内部必须处理传递特殊值的情况),如果这样调用Add(2),其实是给firstnumber传值了,相当于调用了传递了一个参数的情况。


  • 相关阅读:
    Remote Desktop manager 连接后无法自动登录
    .net framework 源码调试 与 问题解决
    SQLSever--基础学习--创建登录用户&创建数据库用户&分配权限
    sql server 2008 数据库管理系统使用SQL语句创建登录用户步骤详解
    python 脚本备份mssql数据库并删除数据库
    python 脚本bak文件还原mssql数据库
    python3 爬虫利用Requests 实现下载进度条
    MySQL的四种事务隔离级别
    查看mysql的版本号
    haproxy 配置文件详解 之 backend
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3230794.html
Copyright © 2011-2022 走看看