JavaScript参数传递问题
在进行JavaScript开发过程中,遇到了这样一个场景,我调用了一个方法,但是需要在原有的参数外重新传递一个参数,而这个方法已经多次被其他地方调用,如果修改参数列表的话,需要改动的地方会很多,重新写一个方法的话,这个方法体量比较大,重写价值比较低。
在我纠结如何解决这个问题的时候,被导师提示,直接在调用的地方传递想要传递的参数就可以了,可是这样的话还能正常调用到方法么,结果证明,可以。
作为对前端技术比较陌生的我,对这种js调用函数时传入的参数个数与函数定义时的参数个数不符时的操作惊为天人,仔细查阅了资料后才明白此中玄妙。
在js中函数没有重载的概念,如果声明了多个重名的函数,不管函数的形参个数是否一样,只有最有一个有效,其他的函数声明都是无效的。比如说声明了两个函数fn(),第一次声明时没有形参,第二次声明时形参有两个,则在调用fn()时不管有没有传入参数,都是调用后声明的那个函数。假如说调用时只传入了1个参数,例如fn(1),则1会赋给函数的第一个形参,而第二个形参不会赋值,如果有用到,就会当undefined处理,可能会报错。如果调用时传入了3个参数,例如fn(1,2,3),则1会赋给第一个形参,2会赋给第二个形参,3是用不上的,但是不会报错。
ECMAScript函数的参数与大多数其他语言中的函数的参数有所不同。ECMAScript函数不介意传递进来多少个参数,也不在乎穿进来参数是什么数据类型。也就是是说,即便你定义的函数值接受两个参数,在调用这个函数时也未必一定要是两个参数。可以传递一个、三个甚至不传递参数,而解析器永远不会有什么怨言。之所以会这样,原因是ECMAScript中的参数在内部是用一个数组来运行的。函数接受到的永远是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。如果这个数组中不包含任何元素,无所谓;如果包含多个元素,也没问题。实际上,在函数体内可以通过arguments对象来访问这个参数数组(arguments[0],arguments[1]),使用length属性可以确定传入参数的个数,arguments对象的长度由传入参数的个数决定,而不由定义参数时命名参数的个数决定,没有传递值的命名参数将自动被赋予undefined值。