如何实现JS函数的重载

JavaScript024

如何实现JS函数的重载,第1张

javascript不能支持函数的重载,如下:

复制代码

代码如下:

<script language="JavaScript">

function f(length)

{

alert("高为:"+length)

}

function f(length,width)

{

alert("高为:"+length+",宽为:"+width)

}

</srcipt>

上面那段代码其实是行不通的,因为函数定义时的参数个数和函数调用时的参数个数没有任何关系。 在函数中可以用f.arguments[0]和f.arguments[1]得到调用时传入的第一和第二个参数,所以定义function(length),后面用f(10,10)调用是没有问题的。所以在上面这段代码中,第二个函数是永远不可能被调用到的,那么,要怎样才能实现像函数重载那样的功能呢?

那就是在函数定义中用f.arguments.length判断一下调用时传入的参数个数。然后对不同的情况采用不同的处理方式。

如下:

复制代码

代码如下:

<script language="JavaScript">

function f()

{

var len= arguments.length

if(1 == len)

{

var length = arguments[0]

var width = arguments[1]

f2(length,width)

}

else

{

var length = arguments[0]

f1(length)

}

}

function f1(length)

{

alert("高为:"+length)

}

function f2(length,width)

{

alert("高为:"+length+",宽为:"+width)

}

</srcipt>

这样,你就可以给函数f()传入一个参数也可以传入两个参数了,比如f(10)和f(10,10);

个人觉得,这样虽然可以实现重载,但也不是很好用,我们可以根据具体情况在一个函数中实现重载,如果要重载的两个函数相差较大,那就保留两个函数,而如果两个函数的实现基本差不多,那么可以在一个函数中进行判断,处理不同的部分,而不需要像上面那样写成三个函数,如下:

复制代码

代码如下:

<script language="JavaScript">

function f(length)

{

var len= arguments.length

if(1 == len)

{

var width = arguments[1]

alert("高为:"+length+",宽为:"+width)

}

else

{

alert("高为:"+length)

}

}

</srcipt>

javascript函数的重载和java的重载方式不一样。

定义JavaScript函数时,函数名是函数对象的标识,参数数量只是这个函数的属性。靠定义参数数量不同的函数实现重载是不行的。

调用函数时,js通过函数名找到对应的函数对象,然后根据函数按照定义时的参数,和表达式参数列表按顺序匹配,多余的参数舍去,不够的参数按undefined处理,然后执行函数代码。所以,js重载函数需要通过函数代码判断参数值和类型实现。

通常定义函数时,把必选参数放在参数列表最前面,可选参数放在参数放在参数列表必须参数后面,方便函数重载。

问:什么是重载?

答:同样的函数,不同样的参数个数。

《JS高级程序设计》里是提到过函数是没有重载的,ts中有重载。但是可以根据arguments的长度来实现重载。

最后定义的fn将前两个fn覆盖掉,所以没有达到重载的效果

虽然上述达到了想要的效果,但不是完美的实现js的重载。

高端实现js的重载做法是利用闭包。

参考资料: https://www.cnblogs.com/yugege/p/5539020.html