arguments

javascript对参数要求很随意,她才不管你传进来的参数是什么数据类型,甚至可以不传参数。实际上,javascript函数调用甚至不检查传入形参的个数。

1     function add(x){
2         return x + 1;
3     }
4     console.log(add(1));  //2
5     console.log(add('1')); // 11
6     console.log(add());  // NAN
7     console.log(add(1,2,5));  //2

同名形参

非严格模式下函数可以有同名形参,但之鞥呢访问最后出现的那个。。。

    function add(x,x,x,){return x;}console.log(add(2,5,6)); //6

参数个数

case1:实参比形参少? 那剩下的形参都设置为undefined

1     function add(x,y){
2         console.log(x,y)
3     }
4     add(1); // 1,undefined

这时候我们可以给y设置一个合理的默认值

1     function add(x,y){
2         y = y || 10000
3         console.log(x,y);
4     }
5     add(1); //1 10000

case2:形参比实参多? 多了就是废的! 可以通过arguments[i]拿到。

参数再内部是用一个数组表示的,arguments对象并不是Array的实例,它是一个类数组对象。

1     function add(){
2         console.log(arguments[0],arguments[1],arguments[2]); //1,2,3
3         console.log(arguments[0]+arguments[1]); //3
4         console.log(arguments.length); //4
5     }
6     add(1,2,3,4);

case3:形参和实参一样多?  此时命名参数和对应arguments对象的值相同,但不是相同的命名空间。换句话说,两者值同步,命名空间独立。

callee

arguments对象有个callee属性,是一个指针,指向拥有这个arguments对象的函数,看如下阶乘

   function factorial(num){if(num <= 1){return 1;}else{return  num * factorial(num - 1);}}factorial(6);  //720

1     function factorial(num){
2         if(num <= 1){
3             return 1
4         }else{
5             return num * arguments.callee(num -1);
6         }
7     }
8     factorial(6); //720

caller

函数的caller属性保存着调用当前函数的函数的应用,如果是在全局作用于中调用当前函数,它的值是null

下面这个没撒意义,好玩而已

1     function mother(){
2         son();
3     }
4     function son(){
5         mother();
6     }
7     mother();   //Uncaught RangeError: Maximum call stack size exceeded
8     //栈溢出。。。

这个才是正道

1     function mother(){
2         son()
3     }
4     function son(){
5         console.log(son.caller);
6     }
7     mother();  //function mother(){son()}

arguments对象的caller始终是undefined,这样定义时为了和函数的caller区分开。。

1     function mother(x){
2         console.log(arguments.caller);
3     }
4     mother(100); //undefined

参数传递

case1:基本类型值

1 function addTen(num){
2 num += 10;
3 return num;
4 }
5 var count = 20;
6 var result = addTen(count);
7 console.log(count);//20,没有变化
8 console.log(result);//30

case2:引用类型值

在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反应在函数的内部(好特么拗口!!)

1     function setInfo(obj){
2         obj.name = 'lihong'
3     }
4     var person = new Object();
5     setInfo(person);
6     console.log(person.name); //lihong

当在函数内部重写引用类型的形参时,这个变量引用的就是一个局部对象了。这个局部对象会在函数执行完毕后立即被销毁

    function setInfo(obj){obj.name = 'lihong';console.log(person.name);obj = new Object();obj.name = 'linyao';console.log(person.name);}var person = new Object();

运行结果:“老公” “老公”   说明了什么?  婆娘不重要!哈哈

转载于:https://www.cnblogs.com/cdut007/p/7287424.html

深入理解javascript函数参数相关推荐

  1. 深入理解javascript函数系列第二篇——函数参数

    前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数.本文是深入理解javascript函数 ...

  2. 2020-08-14 理解 javascript 函数中的 curry

    理解 javascript 函数中的 curry 函数柯里化: 所谓函数柯里化就是把一个函数的多个传参变成多个函数的单个传参. 函数的柯里化,是 Javascript 中函数式编程的一个重要概念.它返 ...

  3. JavaScript 函数参数

    JavaScript 函数参数 JavaScript 函数对参数的值没有进行任何的检查. 函数显式参数(Parameters)与隐式参数(Arguments) functionName(paramet ...

  4. JavaScript 函数参数是传值(byVal)还是传址(byRef)?

    对于"JavaScript 函数参数是传值(byVal)还是传址(byRef)"这个问题,普遍存在一个误区:number,string等"简单类型"是传值,Nu ...

  5. 深入理解javascript函数进阶系列第一篇——高阶函数

    前面的话 前面的函数系列中介绍了函数的基础用法.从本文开始,将介绍javascript函数进阶系列,本文将详细介绍高阶函数 定义 高阶函数(higher-order function)指操作函数的函数 ...

  6. javascript函数参数的传递问题

    在javascript中数组是引用传递的.先来看一段代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN& ...

  7. 深入理解 JavaScript 函数的特性与最佳实践

    函数用于指定对象的行为.所谓的编程,就是将一组需求分解为一组函数和数据结构的技能. 1 函数对象 JavaScript 函数就是对象.对象是名值对的集合,它还拥有一个连接到原型对象的链接.对象字面量产 ...

  8. 【译】理解Javascript函数执行—调用栈、事件循环、任务等

    原文作者:Gaurav Pandvia 原文链接:medium.com/@gaurav.pan- 文中部分链接可能需要梯子. 欢迎批评指正. 现如今,web开发者(我们更喜欢被叫做前端工程师)用一门脚 ...

  9. 理解JavaScript函数(函数和对象的区别和联系)

    原文:http://harrison2010.javaeye.com/blog/173446 函数对象和其他内部对象的关系 除了函数对象,还有很多内部对象,比如:Object.Array.Date.R ...

最新文章

  1. Emoji表情图标在iOS与PHP之间通信及MySQL存储
  2. 自制程序清除系统垃圾文件
  3. 【python】【h5py】TypeError: Can‘t convert element to hsize_t
  4. LeetCode-笔记-45.跳跃游戏II-贪心算法
  5. Hadoop科普文—常见的45个问题解答 #183; Hadoop
  6. 南阳理工大学 gnns 新基准
  7. 不会但一定要了解的方面,python列表解析方式
  8. java猜拳游戏代码_Java实现简单猜拳游戏
  9. 论文浅尝 - ACL2020 | 通过集成知识转换进行多语言知识图谱补全
  10. mysql的存储过程放在哪里_mysql存储过程求解,错误在哪里?
  11. opengl矩阵变换与平移缩放旋转
  12. 每天一个linux命令(56)--crontab命令
  13. 计算机能否代替老师英语作文,雅思大作文范文:电脑不可取代老师
  14. layui图标显示不正常,显示成方块
  15. 浅析ERP系统—供应链
  16. android多个微信支付,想用快速开关一键收付款?Android 版微信没适配但你可以自己做...
  17. 牛语 and 采蘑菇的拖拉机
  18. HTML简单表格的制作
  19. 设计模式-结构型模式(7)装饰者模式
  20. NLM(Non-Local means)算法原理

热门文章

  1. python一次性输入3个数_python实现输入数字的连续加减方法
  2. eclipse debug怎么用_利用maven/eclipse搭建ssm(spring+spring mvc+mybatis)
  3. Struts2 文件上传
  4. C# windows定时服务+服务邮箱发送
  5. 12 Essential Bootstrap Tools for Web Designers
  6. jquery在选择器中使用变量及innerText问题(转载)
  7. CERL 2.0 预告:Erlang Style Concurrency + 状态机
  8. 某8位微型计算机地址码为18位,2015广东海洋大学计算机组成原理试题
  9. 计算机二级C语言考的函数,【帮考网】2012计算机等级二级考试C语言:函数递归...
  10. 博客园文章方块背景格式