一、return

函数在执行完return之后停止并立即退出。

return返回值;与return;

如下两个例子:

1 function sum(num1, num2) {
2             num1= num1 + num2;
3             return num1;
4         }
5
6         var result = sum(5, 10);
7         alert(result);//15

 function sum(num1, num2) {num1= num1 + num2;return;}var result = sum(5, 10);alert(result);//undefined;

直接return而不带任何参数的情况一般用于需要提前停止函数执行而又不需要返回值的情况。

如下:

 function counter() {for (var count = 1; ; count++) {console.log(count + "A");if (count === 5) {return;}console.log(count + "B");}console.log(count + "C");  }counter();

二、参数

ECMAscript函数参数的特点;

  • 不介意传递进来多少个参数
  • 不介意传递进来的参数的数据类型

之所以有上述两个特点,是因为ECMAscript参数在内部是用一个数组表示的。函数接收到的始终是这个数组,而不关心数组中包含哪些参数,或者是否有参数。

实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。

例如:

function sayHi(name, message) {alert("Hello " + name + ", " + message);    }sayHi("杨小漾", "how are you today?");

也可以写成:

function sayHi() {alert("Hello " + arguments[0]+ ", " + arguments[1]);    }sayHi("Nicholas", "how are you today?");

因此,在javascript里面,给参数命名只是提供便利,并不是必需的。

使用arguments.length可以获知有多少个参数传递给了函数,例如:

function howManyArgs() {alert(arguments.length);}howManyArgs("string", 45);    //2howManyArgs();                //0howManyArgs(12);              //1

利用这一点,可以让函数接受任意个参数并分别实现相应的功能:

 1     function doAdd() {
 2             if(arguments.length == 1) {
 3                 alert(arguments[0] + 10);
 4             } else if (arguments.length == 2) {
 5                 alert(arguments[0] + arguments[1]);
 6             }
 7         }
 8
 9         doAdd(10);        //20
10         doAdd(30, 20);    //50

arguments还可以和命名过的参数一起用:

1   function doAdd(num1, num2) {
2             if(arguments.length == 1) {
3                 alert(num1 + 10);
4             } else if (arguments.length == 2) {
5                 alert(arguments[0] + num2);
6             }
7   }
8         doAdd(10);        //20
9         doAdd(30, 20);    //50

arguments的值永远与对应命名参数的值保持同步:

1 function doAdd(num1, num2) {
2             alert(arguments[0] + num2);
3         }
4
5         doAdd(10, 20);        //30
6         doAdd(30, 20);    //50

1  function doAdd(num1, num2) {
2                 arguments[1] = 10;
3             alert(arguments[0] + num2);
4         }
5
6         doAdd(10, 20);        //20
7         doAdd(30, 20);    //40

每次执行doAdd这个函数,都会将第二个参数重写(上述例子中是将第二个参数重新赋值为10)。这是因为,arguments对象中的值会自动反映到对应的命名参数,所以修改

arguments[1],也就相当于修改了num2,不过他们俩的内存空间是独立的,值同步。没有传递值的命名参数将会被赋予undefined,比如:
1         function doAdd(num1, num2) {
2             alert(num2);//undefined
3         }
4
5         doAdd(10);        

arguments还有一个属性:callee,它的作用是返回正在被执行的function例如:
1         function argumentsTest (a,b) {
2             alert(arguments.callee);//返回函数本身
3         }
4         argumentsTest(1,2,3,4);

在使用函数递归调用时推荐使用arguments.callee代替函数名本身。

例如:

 function count(a){if(a==1){return 1;}return a + arguments.callee(--a);}var mm = count(2);alert(mm);

arguments.length返回的是传递给函数的参数个数,也叫实参;而arguments.callee.length返回的是什么呢?看个例子:
1 function calleeLengthDemo(arg1, arg2) {
2                 alert("arguments.length:" +arguments.length);//3
3                 alert("arguments.callee.length:" +arguments.callee.length);//2
4
5         }
6         calleeLengthDemo(1,2,3);

由此可以看出arguments.callee.length返回的是函数定义的参数,即形参。

三、没有重载

ECMAscript函数不能实现重载,不能够定义同样的函数然后通过编译器去根据不同的参数执行不同的函数。

例如:
 1  function addSomeNumber(num1){
 2             return num1 + 100;
 3         }
 4
 5         function addSomeNumber(num2) {
 6             return num2 + 200;
 7         }
 8
 9         var result = addSomeNumber(100);    //300
10         alert(result);

 1 function addSomeNumber(num1){
 2             num1+=100;
 3             return num1 + 100;
 4         }
 5
 6         function addSomeNumber(num2) {
 7             return num2 + 200;
 8         }
 9
10         var result = addSomeNumber(100);    //300
11         alert(result);

只要函数名一致(上述例子中的addSomeNumber),ECMAscript就会认为是同一个东西,那么后定义的就会覆盖先定义的。
对于ECMAscript函数来说,我自己本没有参数,你给我什么参数我就接受什么样的参数。
 

转载于:https://www.cnblogs.com/yxField/p/4224380.html

从头开始学JavaScript (七)——函数相关推荐

  1. 从头开始学JavaScript (五)——操作符(二)

    原文:从头开始学JavaScript (五)--操作符(二) 一.乘性操作符 1.乘法:*      乘法操作符的一些特殊规则: 如果操作数都是数值,按照常规的乘法计算,如果乘积超过了ECMAscri ...

  2. 从头再学 JavaScript 系列前言

    说实话想写这个系列已经很久了,对于每一个学习前端的同学来说,JavaScript 都是必须要掌握的,但是实际上对很多同学而言,特别是刚入门或者入门时间不长的同学,对 JS 的认识并不深.大部分仅仅停留 ...

  3. 从头开始学JavaScript (九)——执行环境和作用域

    一.执行环境:定义了变量或者函数有权访问的其他数据,决定了它们各自的行为.每个执行环境都有与之关联的变量对象. 变量对象:保存着环境中定义的变量和函数. 作用域链:保证对执行环境有权访问的所有变量和函 ...

  4. 从头开始学JavaScript (十三)——Date类型

    说明:UTC:国际协调日期 GMT:格林尼治标准时间 一.date类型的创建 使用new操作符和Date()构造函数 var now=new Date(): 传入参数:Date.parse()和Dat ...

  5. 闲来没事学Dart(七)函数

    /*内置方法/函数:print();自定义方法:自定义方法的基本格式:返回类型 方法名称(参数1,参数2,...){方法体return 返回值;} */void printInfo(){print(' ...

  6. [译] ES6+ 中的 JavaScript 工厂函数(第八部分)

    本文讲的是[译] ES6+ 中的 JavaScript 工厂函数(第八部分), 原文地址:JavaScript Factory Functions with ES6+ 原文作者:Eric Elliot ...

  7. 怎么学JavaScript?

    作者:小不了 链接:https://zhuanlan.zhihu.com/p/23265155 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 鉴于时不时,有同学私信 ...

  8. 老姚浅谈:怎么学JavaScript?

    大家好,我是若川.当初我就是看本文深受启发,开始看书读源码.所以现在联系了作者@老姚 授权转载分享给大家.我按照文中的做法敲完了<JavaScript语言精粹 修订版>,在2017年7月2 ...

  9. 统一回复《怎么学JavaScript?》

    作者:小不了 链接:https://zhuanlan.zhihu.com/p/23265155 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 鉴于时不时,有同学私信 ...

最新文章

  1. 欠阿里云一分钱,会是什么样的后果...
  2. 有关try..catch..finally处理异常的总结
  3. 作为管理者的你,如何用人?一点建议给你
  4. python中findroot_python文件查找之find命令
  5. Discuz!X论坛开发(九)二次开发之Discuz X2 文件目录功能详解
  6. golang中的select详解
  7. 记一些茅塞顿开的事情
  8. 使用Spring WS创建合同优先的Web服务
  9. 数据结构与算法--8.二叉树的基础知识
  10. java集群_「Java知识」MyCat的图文视频讲解,MyCat分片集群分表分库策略
  11. 误删除了Oracle的dbf文件后的解决方法
  12. ftrace 的使用【转】
  13. CF712E [Memort and Casinos]
  14. 原生js实现动态生成表格
  15. 通用稳定DNS,国际DNS,国内DNS,公共DNS
  16. linux给两台主机设置虚拟ip,如何把linux配置成ip路由器
  17. Hook技术之消息拦截(Windows Hook )
  18. 数据结构(使用尾插法实现单链表)
  19. Trans系列文章解读
  20. 浏览器报TypeError: Object(...) is not a function的解决方法

热门文章

  1. Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.ClassVisitor
  2. 前端学习资料(书籍和视频)
  3. promo和promotion
  4. Domino+Qucikplace+Sametime构建企业办公平台图文攻略(四)
  5. MySQL -> ES 数据同步 配置步骤
  6. android通过webservice验证用户 .
  7. Krpano skin_settings解释
  8. Java求字符串中出现次数最多的字符
  9. kotlin集合操作符——顺序操作符
  10. 修改 MySQL 自增ID的起始值