前言:这是笔者学习之后自己的理解与整理。如果有错误或者疑问的地方,请大家指正,我会持续更新!

  调用函数时,实参和形参需要一一对应,但如果参数多了的话,会很苦恼;

  我们可以用键值对(字面量对象)的方式传参,这样参数的顺序就无关紧要了;

        <script type="text/javascript">
function test4(name,age,height,pos){
return name+age+height+pos;
}
console.log(test4('Shane',25,172,'wuhan'));//Shane25172wuhan var person = {
name : 'Shane',
age : 25,
height : 172,
pos : 'wuhan'
}
function test5(obj){
return obj.name+obj.age+obj.height+obj.pos;
}
console.log(test5(person));//Shane25172wuhan
console.log(test5({//匿名对象可也以
name : 'Shane',
age : 25,
height : 172,
pos : 'wuhan'
}));//Shane25172wuhan
</script>

  非严格模式下,相同的形参会被最后一个形参覆盖;

  严格模式不允许出现相同形参,会报错;

        <script type="text/javascript">
function test(x,x,x){//非严格模式下,相同的形参会被最后一个形参覆盖;严格模式不允许出现相同形参,会报错
return x;
}
console.log(test(1,2,3));//3
</script>

  当实参比形参个数要少,剩下的形参都将设置为 undefined 值;

  当实参比形参个数要多,剩下的实参没有办法直接获得,需要使用即将提到的 arguments对象;

  在 Javascript 中,arguments 对象是当前函数的一个内置属性;

  arguments 非常类似 Array,但实际上又不是一个 Array 实例;

  arguments 对象的 length 属性显示实参的个数,函数的 length 属性显示形参的个数。

        <script type="text/javascript">
function test2(x,y,z){
console.log(x,y,z);//1和2和undefined
}
test2(1,2); function test3(x,y,z){
console.log(x,y,z);//1,2,3
console.log(arguments);//[1, 2, 3, 4] arguments非常类似Array,但实际上又不是一个Array实例。
console.log(typeof arguments);//object
console.log(arguments instanceof Array)//false
console.log(arguments[0]);//1
console.log(arguments[1]);//2
console.log(arguments[2]);//3
console.log(arguments[3]);//4
console.log(arguments.length);//4 arguments对象的长度是由实参个数决定而不是形参个数决定的
}
test3(1,2,3,4);
console.log(test3.length);//3 函数的length属性显示形参的个数
</script>

  在非严格模式下,当形参与实参的个数相同时,arguments 对象的值和对应形参的值保持同步;

  虽然形参和对应 arguments 对象的值相同,但并不是相同的命名空间;

  但在严格模式下,arguments 对象的值和形参的值是独立的;

        <script type="text/javascript">
function test6(x,y){
console.log(x,arguments[0]);//1 1 在非严格模式下,当形参与实参的个数相同时,arguments对象的值和对应形参的值保持同步;
console.log(y,arguments[1]);//2 2 x = 345;
console.log(x,arguments[0]);//345 345 在非严格模式下,当形参与实参的个数相同时,arguments对象的值和对应形参的值保持同步;
arguments[1] = 789;
console.log(y,arguments[1]);//789 789
}
test6(1,2); function test7(x,y){
console.log(x,arguments[0]);//undefined undefined arguments[0] = 345;
console.log(x,arguments[0]);//undefined 345
//当形参并没有对应的实参时,arguments对象的值与形参的值并不对应,所以形参和对应arguments对象是不同的命名空间;
}
test7(); function test8(x,y){
'use strict'; //定义严格模式
console.log(x,arguments[0]);//3 3 arguments[0] = 456;
console.log(x,arguments[0]);//3 456 在严格模式下,arguments对象的值和形参的值是独立的;
x = 789;
console.log(x,arguments[0]);//789 456
}
test8(3);
</script>

  在未知参数数量的情况下,可以用 arguments

        <script type="text/javascript">
//在未知参数数量的情况下,可以用arguments
function add(){
var sum = 0;
for(var i = 0; i < arguments.length; i++){
sum += arguments[i]; //参数累加
}
return sum;
}
console.log(add(0));//0
console.log(add(0,1,2,3));//6
</script>

  arguments 对象有一个 callee 属性,该属性是一个指针,指向拥有这个 arguments 对象的函数,也就是函数本身;

  arguments.callee() 返回此 arguments 对象所在的当前函数引用。在使用函数递归调用时推荐使用 arguments.callee 代替函数名本身。

  function.caller() 返回一个对当前函数的引用,该引用调用了当前函数;

  在严格模式下,不能使 callee 和 caller 属性,会报错 TypeError;

        <script type="text/javascript">
function fallingfactorial1 (x){//简单的阶乘
x = Math.round(Math.abs(x));
if(x <= 1){
return 1;
}else{
return x*fallingfactorial1 (x-1);//递归,这里需要写函数名,如果外面函数名改变,这里也得改,有点麻烦
}
}
console.log(fallingfactorial1(3));//6 function fallingfactorial2 (x){//简单的阶乘
x = Math.round(Math.abs(x));
if(x <= 1){
return 1;
}else{
console.log(arguments.callee);//fallingfactorial2(x);
return x*arguments.callee(x-1);//使用arguments.callee,如果外面函数名改变,这里会自己去找的
}
}
console.log(fallingfactorial2(5));//120 function fallingfactorial3 (x){//简单的阶乘
'use strict';//严格模式
x = Math.round(Math.abs(x));
if(x <= 1){
return 1;
}else{
return x*arguments.callee(x-1);//在严格模式下,不能使用callee属性,会报错TypeError
}
}
// console.log(fallingfactorial3(5));//Uncaught TypeError function father(){
son();
} function son(){
console.log(son.caller);
console.log(arguments.callee.caller); //callee和caller结合使用,寻找当前函数的引用
}
son();//null
father();//function father(){son();} function test9(){
'use strict';//严格模式
console.log(test9.caller); //在严格模式下,不能使用caller属性,会报错TypeError
}
// test9();//Uncaught TypeError
</script>
</body>

jacascript 函数参数与 arguments 对象的更多相关文章

  1. 不定参数对arguments对象的影响

    如果声明函数时定义了不定参数,则在函数被调用时,arguments对象包含了所有传入的参数: function checkArgs(...args){ console.log(args.length, ...

  2. 函数中的 arguments 对象

    JavaScript函数具有像数组一样的对象,这些对象称为arguments,与传递给函数的参数相对应.传递给JavaScript函数的所有参数都可以使用arguments对象来引用. 现在我们开始学 ...

  3. JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)

    函数声明 JavaScript中声明函数的方式:(无需声明返回值类型) function add(i1, i2) {             return i1 + i2;//如果不写return返回 ...

  4. JavaScript函数中的arguments对象

    ECMAScript标准中,每个函数都有一个特殊的内置对象arguments.arguments对象是一个类Array对象(object),用以保存函数接收到的实参副本. 一.内置特性 说它是一个内置 ...

  5. JavaScript 没有函数重载&amp;Arguments对象

    对于学过Java的人来说.函数重载并非一个陌生的概念,可是javaScript中有函数重载么...接下来我们就进行測试 <script type="text/javascript&qu ...

  6. es6和es5函数参数和arguments的差别

    注: 这里说的 es5 代表的都是非严格模式下. es6之前函数的参数不能传默认值: function fn(a, b){ console.log(a) console.log(b) } fn(2) ...

  7. js理论-函数中的Arguments对象

    详情参考:https://github.com/mqyqingfeng/Blog/issues/14 如果: arguments和实参的关系,以及arguments的属性 附上代码和注解 functi ...

  8. 理解Javascript参数中的arguments对象

    ECMAScript中函数没有标签名的特性,所以ECMAScript函数中没有重载. Javascript中arguments的存在可以弥补javascript中函数没有重载的不足. Javascri ...

  9. js-arguments 函数参数对象详解

    前言 JavaScript 函数参数不同于其他编程语言,既不需要规定参数的类型,也不需要关心参数的个数,因此 JavaScript 因函数参数而变得十分灵活,本文总结一下 arguments 参数对象 ...

随机推荐

  1. 笔记:MyBatis XML配置-typeAliases 内建别名表

    别名 映射的类型 _byte byte _long long _short short _int int _integer int _double double _float float _boole ...

  2. 避免uncaughtException错误引起node.js进程崩溃

    uncaughtException 未捕获的异常, 当node.js 遇到这个错误,整个进程直接崩溃. 或许这俩个人上辈子一定是一对冤家. 或许这俩个人经历了前世500次的回眸才换来了今生的相遇,只可 ...

  3. iOS 10.10 10.11 10.12 安装升级CocoPods

    CocoPods简介 CocoaPods是一个用Ruby写的,负责管理iOS以及OSX系统下的一个第三方类库管理工具,通过CocoaPods,我们可以集中,统一的管理第三方开源库.当然这些库徐亚Coc ...

  4. java高并发锁的三种实现

    提到锁大家会想到Synchronized同步关键字,使用它确实可以解决一切并发问题,但是对于体统吞吐量要求更高,在这里提供了几个小技巧.帮助大家减少锁粒度.提高系统的并发能力 一.乐观锁 试用场景:读 ...

  5. 让Myeclipse自动生成的get set方法 自动加上文本注释,并且注释内容包含字段中我们加的文档注释

    在进行编码写实体类的时候发现,一个实体类有好多的字段要进行注释,他们都是私有的不能直接访问,我们在写的时候加入的文档注释也起不到效果,但是自动生成的get,set方法的文档注释有不符合我们要求(没有包 ...

  6. 推荐一个利用 python 生成 pptx 分析报告的工具包:reportgen

    reportgen v0.1.8 更新介绍 这段时间,我对 reportgen 进行了大工程量的修改和更新.将之前在各个文章中出现的函数进行了封装,同时也对现有工具包的一些逻辑进行了调整. 1.rep ...

  7. Go实现海量日志收集系统(二)

    一篇文章主要是关于整体架构以及用到的软件的一些介绍,这一篇文章是对各个软件的使用介绍,当然这里主要是关于架构中我们agent的实现用到的内容 关于zookeeper+kafka 我们需要先把两者启动, ...

  8. Django+xadmin打造在线教育平台(十)

    十四.xadmin的进阶开发 14.1.权限管理 (1)用户权限 超级用户拥有所有权限,其它添加的用户默认没有任何权限 进后台添加一个用户“Editor1”,勾上“职员状态”后,这个用户才可以登录进后 ...

  9. Django--基本篇:项目结构与设计模式(MVC)

    Django在项目开发中有着结构清晰.层次明显.容易编写理解查阅demo的优点,那么我们来个小案例具体看看.    一.项目结构简析: 我们按照上一篇中的开发流程步骤创建一个新项目myblog,项目下 ...

  10. C语言博客作业字符数组

    一.PTA实验作业 7-12 IP地址转换 本题PTA提交列表 设计思路 3.代码截图 7-7删除字符串中的子串 本题PTA提交列表 设计思路 定义字符型数组s[81]储存主串,sub[81]储存子串 ...