js函数形参、实参、arguments[]的一探究竟

//先声明下:菜鸟原创,不当之处望大虾们指正,

函数的形参、实参、arguments[]都在哪个位置?参数通过值传递——传递流程是怎样的?js函数调用时接受的实参数目与函数定义时不一样行吗?……关于参数的问题很多,着实让人头大啊。探究参数的问题,本文认为模型无非是酱紫的:

var xaa;
function f(xbb) {
xcc;
arguments[];
}
f(xdd);

如果把x**作为参数看,上述地方以及arguments[]出没的参数都很可能让人含混不清,按着这个模型写一串代码,然后来一探究竟,as you know上图最能说明问题:

code123

一、上图的代码探究的情况是a.实参是[数值,空,x]三种情况,b.形参不空且为x,三种情况我们对比来看看函数参数怎么传值、函数内部变量x怎么变化、arguments[]这个属性又做了什么。经捣机捣几下,可以发现:

1、框框中函数调用,fn( )括号里的东西是实参;

2、函数申明 function fn(x){…}中的x是形参;

3、函数体里头的变量x是私有变量();

4、arguments[]也在且只在函数体里有意义。


于是,参数传值流程来了,

step1:实参会获取全局环境中的值,如第三块x获取全局定义var x =11;的值,第二块f( )调用获取了一个空值undefined;

step2:实参值会传给函数申明中的形参x,值到括号里了,此时形参的值==实参的值;

step3:形参x(亦局部变量)的值在函数体内通体有效,值到达函数体内部了,代码块中第一个console.log(x)都是反馈刚刚拿到的形参x的值;

step4:函数内部变量x一律将形参x的值覆盖,给arguments[0]赋值,内部变量x的值也相应变化——问题来了,函数内部的x是什么?arguments[]又会怎么随着这些参数联动?……

而实际上,函数申明function fn(x){…}时带了形参,就相当于给函数内部挂了一个var x;因此函数内部贸然出现的x实际上已经是局部变量了,而并非隐式声明的全局变量!!所以形参的值x=11才会被内部的x=10覆盖。再上码为证:

var x = 11;
  function fn(){
    console.log(x); //11
    x = 10;
    console.log(x);  //10
    arguments[0] = 20;
    console.log(x);  //10
  }
  fn();
  console.log(x);  //10
上述代码里所有的x都是全局变量,因为函数申明时并没有带形参,不会在函数内部挂一个var x了,所以在外运行函数fn( ),起到给全局变量x更新赋值的作用,故最后console.log(x)结果为10的。。。而arguments[0]在赋值20之前是没有值的,且arguments.length = 0,由此进一步引出:arguments[ ]与实参、形参、内部私有变量是怎样的联动关系?

已经知道实参和形参的数目可以对不上,内部私有变量可以改变传递进来的参数的值,那么arguments[]总是获取由实参串起来的实时的参数值,且arguments.length始终等于实参的个数。以下例为证:

  var x = 11;
  function fn(x,y,z,m){                //实参串起来的参数只有3个,故参数m不在arguments的影响范围
    var m =40;
    console.log(arguments.length); //3

    console.log(arguments[0]); //13
    x = 10;//通过覆盖改变第一个参数的值
    console.log(arguments[0]); //10

    console.log(arguments[1]); //14
    console.log(arguments[2]); //15
    console.log(arguments[3]); //undefined    *第4个实参不存在,尽管形参存在,但与arguments无关

    arguments[0] = 20;
    console.log(x);  //20
    arguments[3] = 50;
    console.log(m); //40
  }
  fn(13,14,15);
  console.log(x);  //11

其实总结起来就两点:

1、函数申明function f(x){…}的形参x会在函数体内挂一个var x =?;这样就将形参的值过继到函数体内;

2、arguments以实参为行动宗旨,报告实参传到函数体内的实时样子。

//更高级的问题现在水平有限,于是就探究到这里,关于参数脉络应该也清楚了~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值