在使用js时使用函数是司空见惯的,但是关于函数的形参以及命名参数的基本概念一直仅限于会用而没有去揪其本源,所以有空就研究一下。
首先js给的解析是,真正进入函数的局部参数是存放在argument这个伪数组对象中的,也就是说,不管是否传递了命名参数,都能通过argument对象(伪数组)来进行访问,如下图:
因为在调用的时候传递了俩个形参,而函数却没有设置命名参数,但是依旧可以通过argument对象访问到,如下图
这也就验证了真正传入函数的局部参数是通过给argument添加的指针指向形参的值(因为argument是对象,所以用的是"引用复制",而传进来的形参却是"基本类型",所谓基本类型就是指没有引用指针的,而是直接存在于栈内存中的值),那么改变argument指针指向的值会改变原来的形参么,答案是不会,
因为作用域的问题,argument复制的对象指针也是局部的,如下图:
那么运行之后的值为:
同时也验证了传进去的命名参数也是局部变量的复制体,因为这与argument对象的某个属性指针指向的是同一个作用域的值,所以可以被改变,
还有一种情形就是,如果给了多个命名参数,但是却只传进去了一个形参,那么多出来的就会被认为是undefined,这种情况在严格模式下是错误的。
在传入来个相同的命名参数之后,js会才用后传的值,因为js设计的模式是不传参数的类型(整型......),所以不可能会重载,那么js就会将后传的值覆盖掉之前传的值(因为是局部的一个复制,很好理解,没记错的话这种情况在严格模式也会报错),贴个图吧:
node一下的结果:
(es6的一个类数组参数 ...arguments可能就是基于这样的一个封装。)
over!
网友评论