深入理解javascript函数参数

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux系统时间函数,Linux时间时区详解与常用时间函数

时间与时区整个地球分为二十四时区&#xff0c;每个时区都有自己的本地时间。UTC时间 与 GMT时间我们可以认为格林威治时间就是时间协调时间(GMT UTC)&#xff0c;格林威治时间和UTC时间都用秒数来计算的。UTC时间与本地时间UTC 时区差 本地时间时区差东为正&#xff0c;西为…

7-5 汉诺塔的非递归实现 (25 分)

7-5 汉诺塔的非递归实现 (25 分) 借助堆栈以非递归&#xff08;循环&#xff09;方式求解汉诺塔的问题&#xff08;n, a, b, c&#xff09;&#xff0c;即将N个盘子从起始柱&#xff08;标记为“a”&#xff09;通过借助柱&#xff08;标记为“b”&#xff09;移动到目标柱&…

js 异步问题

如果发现前端的异步请求&#xff0c;network有发送成功而且有返回值&#xff0c;但是没有进前端的callback成功回掉函数内&#xff0c;这时候就需要检查是不是配置文件做了语法限制&#xff0c;只能返回某些数据格式&#xff0c;不能返回某些数据格式。 一般限制最多的就是后端…

海康、大华IPC的rtsp格式

海康&#xff1a;  rtsp://[username]:[password][ip]:[port]/[codec]/[channel]/[subtype]/av_stream说明&#xff1a;username: 用户名。例如admin。password: 密码。例如12345。ip: 为设备IP。例如 192.0.0.64。port: 端口号默认为554&#xff0c;若为默认可不填写。codec…

linux awr 日志,Linux平台生成awr报告

1&#xff0e;使用Oracle用户登录应用服务器所使用的数据库所在的服务器# su –oracle2&#xff0e;输入env命令&#xff0c;查询出ORACLE_HOME 目录3&#xff0e;然后进入$ORACLE_HOME/rdbms/admin目录&#xff0c;查询awr语句(此步骤可以忽略)此处可以直接省略2&#xff0c;3…

利用一维数组输出杨辉三角

直接上代码&#xff1a; package hello;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n in.nextInt();int table [] new int [n1];table[0] 1;for (int i1;i<n;i) {for (int j0;j<…

缓存(Cache)管理 ---- 系列文章

利用Cache防止同一帐号重复登录.net中Cache管理操作系统缓存全解析 (下)系统缓存全解析 (中)系统缓存全解析 (上)出处&#xff1a;http://www.cnblogs.com/luckdv/tag/%E7%BC%93%E5%AD%98/转载于:https://www.cnblogs.com/mq0036/p/7291955.html

找到一个二位数组的鞍点

上代码&#xff1a; package hello;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int mat[][] new int[3][3];for (int i0;i<3;i) {for (int j0;j<3;j) {mat[i][j] in.nextInt();}}bool…

linux 文件按时间 函数,[Linux文件属性]使用utime函数操作文件的时间参数

//这是一个使用utime函数对文件的时间参数进行修改的实例//文件首先使用stat函数获得文件当前的时间参数&#xff0c;然后使用//Open函数对文件进行修改&#xff0c;再用utime函数对文件的时间信息//进行修改.文件名由argv参数给出#include #include #include int main(int arg…

HDU 1159 Common Subsequence 动态规划

2017-08-06 15:41:04 writer&#xff1a;pprp 刚开始学dp&#xff0c;集训的讲的很难&#xff0c;但是还是得自己看&#xff0c;从简单到难&#xff0c;慢慢来&#xff08;如果哪里有错误欢迎各位大佬指正&#xff09; 题意如下&#xff1a; 给两个字符串&#xff0c;找到其中大…

用类,求三个数的最大数

上代码&#xff1a; package hello;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int a,b,c;a in.nextInt();b in.nextInt();c in.nextInt();int num max(a,b,c);System.out.println("…

【Xmail】使用Xmail搭建局域网邮件服务器

下载地址&#xff1a; http://www.xmailserver.org/xmail-1.27.win32bin.zip&#xff0c;当前最新版本 1.27。 解压文件&#xff1a;xmail-1.27.win32bin.zip 1、把其中的 MailRoot 目录拷贝到 C:\&#xff1b; 2、把 C:\xmail-1.27.win32bin\xmail-1.27 目录下的所有文件&am…

linux ntfs硬盘自动挂,linux下查看所有硬盘分区+挂接NTFS磁盘/硬盘+自动挂接硬盘方法...

基本上所有Linux 发行版在启动系统时都是根据/etc/fstab文件的配置来挂载分区的。在/etc/fstab中&#xff0c;根据不同格式的分区&#xff0c;其挂载参数也不同&#xff0c;参数不同其结果不同&#xff0c;包括用户的读写权限&#xff0c;下面一一说来。1、对于fat32格式分区&a…

uploadify 配置后,页面显示无效果

uploadify使用的是Flash版本 谷歌浏览器&#xff1a;默认没有开启Flash&#xff0c;进行如下图设置即可 转载于:https://www.cnblogs.com/daryl/p/7299471.html

linux 磁盘科隆,上海第二工业大学嵌入式操作系统B复习(无答案版)

嵌入式操作系统B复习答疑时间6月18日9&#xff1a;00—14:00,15#518填空题20分&#xff0c;选择题20分&#xff0c;判断题10分&#xff0c;简答题20分&#xff0c;实验题30分。一&#xff0e;填空题1.ARM中断处理有哪两种中断模式、快速中断模式。2.基于J-TAG调试结构包括哪几个…

Day39:threading模块、ThreadLocal

一、threading模块 1、线程对象的创建 1.1 Thread类直接创建 import threading import timedef countNum(n): # 定义某个线程要运行的函数print("running on number:%s" %n)time.sleep(3)if __name__ __main__:t1 threading.Thread(targetcountNum,args(23,)) #生成…

linux h5 动画软件下载,技术|7款绚丽的jQuery/HTML5动画及源码

jQuery是一款非常流行的JavaScript框架&#xff0c;利用jQuery&#xff0c;我们可以制作简单的动画效果&#xff0c;但是结合HTML5&#xff0c;这样的动画效果就会变得更加出彩。本文分享了7款jQuery结合HTML5的动画以及源码下载。1、HTML5/SVG实现布谷鸟时钟动画这是一款非常有…

时钟抖动对高速ADC采样系统的影响

在高速数据采样中&#xff0c;ADC时钟信号的稳定性对其性能有至关重要的影响&#xff0c;因为这些抖动会破坏高速ADC的时序。 孔径的定义 孔径时间ta&#xff0c;是指从采样时钟跳变开始&#xff0c;一直到保持电压建立。换言之&#xff0c;孔径是指采样保持电路中开关切换的时…

7-3 堆中的路径 (25 分)

7-3 堆中的路径 (25 分) 将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i&#xff0c;打印从H[i]到根结点的路径。 输入格式: 每组测试第1行包含2个正整数N和M(≤1000)&#xff0c;分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000…

windows7远程linux,用XManager在Windows7下远程桌面连接Linux

用XManager在Windows7下远程桌面连接LinuxXManager是一个简单易用的高性能的运行在Windows平台上的X-Server软件&#xff0c;而Gnome和KDE就是X-Client&#xff0c;Linux下的X-Server则为Xorg。它能把远端Unix/Linux的桌面无缝地带到你的Windows上&#xff0c;甚至当你的电脑是…