//先声明下:菜鸟原创,不当之处望大虾们指正,
函数的形参、实参、arguments[]都在哪个位置?参数通过值传递——传递流程是怎样的?js函数调用时接受的实参数目与函数定义时不一样行吗?……关于参数的问题很多,着实让人头大啊。探究参数的问题,本文认为模型无非是酱紫的:
var xaa;
function f(xbb) {
xcc;
arguments[];
}
f(xdd);
如果把x**作为参数看,上述地方以及arguments[]出没的参数都很可能让人含混不清,按着这个模型写一串代码,然后来一探究竟,as you know上图最能说明问题:
一、上图的代码探究的情况是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 |
已经知道实参和形参的数目可以对不上,内部私有变量可以改变传递进来的参数的值,那么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以实参为行动宗旨,报告实参传到函数体内的实时样子。
//更高级的问题现在水平有限,于是就探究到这里,关于参数脉络应该也清楚了~