`

js中为何没有重载

阅读更多
1.理解参数

JavaScript函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。也就是说,即便你定义的函数只接收两个参数,在调用这个函数时也未必一定要传递两个参数。可以传递一个、三个甚至不传递参数。你肯定在疑问为什么会这样?

原因在于JavaScript中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。如果这个数组中不包含任何元素,无所谓;如果包含多个元素,也没问题。实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给参数的每一个参数。

例1:
function howManyArgs(){
    alert(arguments.length);
}

howManyArgs("string",45);//2
howManyArgs();//0
howManyArgs(12);//1


这也说明了JavaScript函数的一个重要特点:命名的参数只提供便利,但不是必须的。

关于arguments的行为,还有一点比较有意思。那就是它的值永远与对应命名参数的值保持同步。

例2:
function doAdd(num1,num2){
    arguments[1]=10;
    alert(arguments[0]+num2);
}

doAdd(30,30);//40

因为arguments对象中的值会自动反映到对应的命名参数,即修改arguments[1],也就修改了num2.另外因为arguments的长度是由传入的参数个数决定的,不是由定义函数时的命名参数的个数决定的。即如果只传入一个参数,num2的值为undefined,那么为arguments设置的值不会反映到命名参数中。

2.没有重载

在java中,可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可,但在JavaScript中,函数没有签名,因为其参数是由半酣零或多个值的数组来表示的。而没有函数签名,真正的重载是不可能做到的。

如果在JavaScript中定义了两个名字相同的函数,则改名字只属于后定义的函数。
例3:
function addNum(tmp1)
{
    alert(tmp1+100);
}

function addNum(tmp1,tmp2)
{
    alert(tmp1+200);
}

addNum(100);//300


3.没有重载(深入理解)

函数实际上是对象,每个函数都是Funciton类型的实例,而且都与其他类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。

var sum = new Function("num1","num2","return num1+num2");//不推荐


这是一种定义函数的方式——使用Function的构造函数,最后一个参数始终被看成函数体。但是不推荐使用这种定义方式,因为会导致解析两次代码:第一次是解析常规的JavaScript代码,第二次是解析传入构造函数中的字符串,从而影响性能。不过,这种语法对于理解"函数时对象,函数名是指针"的概念导师非常直观的。

由于函数名仅仅是指向函数的指针,因此函数名与包含对象指针的其他变量没有什么不同。换句话说,一个函数可能会有多个名字。
例4:
function sum(num1,num2){
    return num1+num2;
}  

alert(sum(10,10));//20

var anotherSum =sum;
alert(anotherSum(10,10));//20 

sum=null;
alert(anotherSum(10,10));//20


对例3进行重写,如下:
var addNum = function(tmp1){
    alert(tmp1+100);
};
addNum = function(tmp1,tmp2){
    alert(tmp1+200);
};



通过重写后,很容易看清到底是怎么回事儿——创建第二个函数时,实际上覆盖了引用第一个函数的变量addNum。也可以这样理解,即创建第二个函数后,指针addNum指向了第二个函数,不再指向第一个函数。
  • 大小: 10.3 KB
分享到:
评论

相关推荐

    关于JS重载

    JavaScript(JS)重载是编程中的一个概念,它通常指的是在同一个函数名下定义多个具有不同参数列表的函数,使得根据传入的参数数量或类型,可以调用不同的实现。在许多面向对象的语言中,如Java或C++,函数重载是一...

    js中方法重载如何实现?以及函数的参数问题.docx

    在JavaScript中,函数参数是可选的,如果没有提供足够的参数,剩余的参数默认为 `undefined`。因此,如果你需要确保某些参数是必需的,可以在函数内部检查它们是否为 `undefined`。同时,由于参数是按顺序匹配的,...

    layui数据表格重载实现往后台传参

    在今天的分享中,我们将详细探讨如何使用layui的数据表格组件实现数据重载功能,并将参数传递给后端服务器。LAYui是一款前端UI框架,它提供了丰富的组件,其中包括用于显示和操作表格数据的表格组件。在实际开发中,...

    TypeScript中的方法重载详解

    在TypeScript中,方法重载是一项关键特性,它允许开发者为同一个函数定义多个签名,以适应不同的输入参数和返回类型。这是因为TypeScript是一种静态类型语言,它提供了比JavaScript更强的类型检查,允许开发者在编译...

    JavaScript重载函数实例剖析

    JavaScript中的函数重载是开发者在使用强类型语言如C++或Java时经常遇到的概念,但在JavaScript这门动态类型的脚本语言中,实际上并没有内置的函数重载机制。然而,由于JavaScript的灵活性,开发者可以通过一些技巧...

    JS函数重载的解决方案

    JavaScript是一种支持面向对象编程的语言,然而它的早期版本并不支持函数重载。函数重载是一种编程技术,允许在同一作用域内创建多个同名函数,但这些函数的参数个数或类型至少有一个不同。在其他支持此特性的编程...

    通过实例理解javascript中没有函数重载的概念

    根据ECMAScript的规范,函数名实际上是指向函数对象的引用,因此函数的名称并不能用来区分不同的函数实现,这就解释了为什么JavaScript不支持函数重载。 总结以上内容,可以清楚地了解到,JavaScript中没有函数重载...

    overload-js:javascript中的函数重载

    JavaScript 中的函数重载为 3.9KB,压缩为 1.4KB。 提供工具来模拟大多数严格类型语言中存在的。 防止难以阅读和维护的混乱、冗长、if 语句、类型检查函数。 受和启发的样式和 API。 npm install overload-js ...

    运算符重载详解

    C++中一个很重要的知识点 运算符重载 在实际开发中 很多技术人员都会忽视的

    JS模拟实现方法重载示例

    在JS方法中,不能像C#方法能实现重载,但是我们可以通过js中的arguments来实现js方法的重载。 下面给出html实例: <html> <head> <title>JS方法的重载</title> [removed] function testFun...

    Javascript中的arguments与重载介绍

    在JavaScript中,由于语言的灵活性,并没有像其他语言(如Java、C#)那样支持传统的函数重载,即通过参数类型或数量的不同来调用不同的函数。然而,JavaScript开发者通常可以通过其他技术手段来模拟这种行为,比如...

    js图片大小重载插件

    JavaScript 图片大小重载插件,通常用于优化网页性能,特别是在响应式设计中,能够根据设备屏幕尺寸自动调整图片大小,提高页面加载速度并节省用户流量。jQuery Resize Plugin 是一个由 Adeel Ejaz 创建的优秀插件,...

    JavaScript重载函数实例剖析_.docx

    ### JavaScript重载函数实例剖析 #### 一、引言 在传统的面向对象编程语言如Java或C++中,重载(Overloading)是一种常见的特性,它允许开发者在同一作用域内定义多个同名但参数列表不同的方法。然而,在...

    自定义滚动条jscroll.js修改改进后可动态重载滚动条

    本文将深入探讨如何通过修改和改进`jscroll.js`实现动态重载滚动条的功能。 首先,`jscroll.js`是一个JavaScript库,它允许开发者自定义浏览器的默认滚动条样式,提供更美观、符合设计感的滚动效果。原始的`jscroll...

    js中方法重载如何实现?以及函数的参数问题

    在JavaScript中,方法重载(Overloading)是指在同一个作用域内可以定义多个同名但参数列表不同的函数。然而,与C++或Java等语言不同,JavaScript并不直接支持方法重载。这是因为JavaScript函数的参数是动态类型的,...

    详解JS函数重载

    然而,在JavaScript中,由于其动态类型和弱类型的特点,函数并不直接支持传统的函数重载概念。所有的函数参数在JavaScript中都是通过arguments对象传递的,这是一个类数组对象,它包含了传递给函数的所有参数。...

    让 JavaScript 轻松支持函数重载 (Part 2 - 实现)

    总结来说,函数重载在JavaScript中的实现比较复杂,需要我们进行一些额外的设计和编码工作,但它为JavaScript编程提供了更加灵活和强大的方法定义能力。通过阅读本文,我们可以了解到如何通过自定义静态类和一些策略...

    operator-overloading-js, JS简单运算符重载库.zip

    operator-overloading-js, JS简单运算符重载库 目录Operator-Overloading-JS安装工具node MODULE ( NPM )浏览器( Bower )Sneak示例重载运算符设计考虑/非常重要/必须阅读。Definig使用运算符重载的上下文

Global site tag (gtag.js) - Google Analytics