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覆盖。再上码为证:
上述代码里所有的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以实参为行动宗旨,报告实参传到函数体内的实时样子。
//更高级的问题现在水平有限,于是就探究到这里,关于参数脉络应该也清楚了~
函数的形参、实参、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以实参为行动宗旨,报告实参传到函数体内的实时样子。
//更高级的问题现在水平有限,于是就探究到这里,关于参数脉络应该也清楚了~
相关文章推荐
- JS函数的参数(arguments)的使用(形参和实参)
- 关于js函数的形参和实参
- JS函数实参和形参参数个数不一致时的处理和后果
- JS中,arguments用来存函数的实参
- JavaScript的作用;JS常见的三种对话框;==和===的区别;函数内部参数数组arguments在函数内部打印实参;JS的误区:没有块级作用域
- JS如何判断函数的形参个数与实参个数是否相等
- 函数的形参和实参之arguments对象
- 函数的实参形参,arguments对象基本用法
- 【js学习笔记-047】-- 函数的实参和形参
- JS与PHP在函数传参方面有点不同,PHP形参与实参个数要匹配,而JS就灵活多了,可以随意传参,实参比形参少或多都不会报错
- C/C++中二维数组作函数形参时,调用函数时,可传递的实参类型的小结
- JS函数的参数(arguments)的使用
- 一个讨论引发关于js中函数声明,函数表达式,形参与变量声明赋值引发的一些事(http://www.cnblogs.com/zhouyongtao/archive/2012/11/22/2783089)
- 函数实参和形参(常见的错误理解)
- 二维数组作为函数的实参,定义函数形参的方法
- 【JS--基础--函数】--隐含参数对象arguments的callee 属性
- C++语法基础--模板实参推断,模板类型形参的实参的受限转换,模板实参推断与函数指针
- 关于C语言中一,二级指针函数中的使用和c语言中和函数发生调用时,实参和形参都会占用内存吗?
- 关于,函数调用是传值调用,初始化函数中重新分配内存,导致形参的值和实参的值不一致 问题分析
- 函数调用下形参和实参的内存分配