您的位置:首页 > Web前端 > JavaScript

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

2014-10-18 21:08 513 查看
//先声明下:菜鸟原创,不当之处望大虾们指正,

函数的形参、实参、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
上述代码里所有的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以实参为行动宗旨,报告实参传到函数体内的实时样子。

//更高级的问题现在水平有限,于是就探究到这里,关于参数脉络应该也清楚了~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐