js的函数形参与实参
1.定义
形参:定义函数时候使用的参数,目的是用来接收调用该函数的时候传进来的实际参数.
实参:函数被调用的时候传递给函数的实际参数.
eg:
1 | function fun (a,b,c){ |
这里的abc就是形参,1,2,3就是实参.
2.区别
形参和实参是不同的变量.他们在内存中处于不同的位置.
形参在函数运行结束时释放.
3.注意
1.如果实参是引用类型(object,array),那么对形参值进行修改,会影响到实参的值.
eg:
1 | var obj = {sex:'男'}; |
解释说明:
函数的参数传递有2中方式:值传递和引用传递.
值传递:形参是实参的一个副本,对形参的改变不会影响实参.
引用传递:形参是对实参引用变量的复制,导致形参和实参都指向同一个对象实体(同一内存),所以改变形参,实参也会变.
2.形参与局部变量重名情况的处理
当局部变量未声明,或者已经声明为赋值的情况下.此时内存中还没有这个变量.这时候调用同名变量那么就是形参.
反之,当局部变量赋值完成以后,内存中已经存在这个变量,并且覆盖了同名的形参.在调用同名变量,那么指的就是已经赋值的局部变量.
eg:
1 | function fun (str){ |
唯一个不是很清楚的问题就是变量提升,模拟一下解释器创建执行环境.
1 | function fun (str){ |
解释:
由于存在变量提升,执行第一个
alert()
的时候,局部变量str
只声明了,没有赋值.内存中还没有创建局部变量str
,所以alert()
的str
是形参.
执行str = str + 'node.js';
,左边str
是局部变量,右边str
是形参,互不干扰,此时局部变量str
被赋值了'hellonode.js'
;name = str
此时的str
是局部变量.
所以我们在实际代码中,为了规避掉这个问题,我一般都会在形参前面在加个$
,用以区分和容错.(个人见解)