js中传参之Arguments对象

在使用js时使用函数是司空见惯的,但是关于函数的形参以及命名参数的基本概念一直仅限于会用而没有去揪其本源,所以有空就研究一下。

首先js给的解析是,真正进入函数的局部参数是存放在argument这个伪数组对象中的,也就是说,不管是否传递了命名参数,都能通过argument对象(伪数组)来进行访问,如下图:


因为在调用的时候传递了俩个形参,而函数却没有设置命名参数,但是依旧可以通过argument对象访问到,如下图


这也就验证了真正传入函数的局部参数是通过给argument添加的指针指向形参的值(因为argument是对象,所以用的是"引用复制",而传进来的形参却是"基本类型",所谓基本类型就是指没有引用指针的,而是直接存在于栈内存中的值),那么改变argument指针指向的值会改变原来的形参么,答案是不会,

因为作用域的问题,argument复制的对象指针也是局部的,如下图:


那么运行之后的值为:


同时也验证了传进去的命名参数也是局部变量的复制体,因为这与argument对象的某个属性指针指向的是同一个作用域的值,所以可以被改变,

还有一种情形就是,如果给了多个命名参数,但是却只传进去了一个形参,那么多出来的就会被认为是undefined,这种情况在严格模式下是错误的。

在传入来个相同的命名参数之后,js会才用后传的值,因为js设计的模式是不传参数的类型(整型......),所以不可能会重载,那么js就会将后传的值覆盖掉之前传的值(因为是局部的一个复制,很好理解,没记错的话这种情况在严格模式也会报错),贴个图吧:


node一下的结果:


(es6的一个类数组参数 ...arguments可能就是基于这样的一个封装。)

over!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 夜神月,法学系高材生,逻辑推理能力超强,一天无意中在路上捡到死亡笔记,只要把人的名字写上去,心里想着那人的样貌,那...
    heidi0907阅读 246评论 0 0
  • 世界在变,人也在变。 先前认为,树高千丈叶落归根,以后终归是要回老家的,但现在这想法已不复存在。 人不会有永远安定...
    凤城子阅读 430评论 0 0
  • 一,每天早上六点起床跑步半小时(晚上补) 二,每天早上家人早安问候 三,每天三个群分享 哇,太开心啦,今天回到了老...
    天生赢家杨永刚阅读 249评论 0 0
  • 7、在什么事情上我倾向于假设太多,会认为太多理所当然? 8、在何种程度上,我倾向于持有非此即彼的观点,期望正确的答...
    韫左寻阅读 225评论 3 1