从头开始学JavaScript (七)——函数

一、return
函数在执行完return之后停止并立即退出。
return返回值;与return;
如下两个例子:
function sum(num1, num2) {
num1= num1 + num2;
return num1;
}
var result = sum(5, 10);
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); //
howManyArgs(); //
howManyArgs(12); //
利用这一点,可以让函数接受任意个参数并分别实现相应的功能:
function doAdd() {
if(arguments.length == 1) {
alert(arguments[0] + 10);
} else if (arguments.length == 2) {
alert(arguments[0] + arguments[1]);
}
}
doAdd(10); //
doAdd(30, 20); //
arguments还可以和命名过的参数一起用:
function doAdd(num1, num2) {
if(arguments.length == 1) {
alert(num1 + 10);
} else if (arguments.length == 2) {
alert(arguments[0] + num2);
}
}
doAdd(10); //
doAdd(30, 20); //
arguments的值永远与对应命名参数的值保持同步:
function doAdd(num1, num2) {
alert(arguments[0] + num2);
}
doAdd(10, 20); //3
doAdd(30, 20); //
function doAdd(num1, num2) {
arguments[1] = 10;
alert(arguments[0] + num2);
}
doAdd(10, 20); //
doAdd(30, 20); //
每次执行doAdd这个函数,都会将第二个参数重写(上述例子中是将第二个参数重新赋值为10)。这是因为,arguments对象中的值会自动反映到对应的命名参数,所以修改
arguments[1],也就相当于修改了num2,不过他们俩的内存空间是独立的,值同步。
没有传递值的命名参数将会被赋予undefined,比如:
function doAdd(num1, num2) {
alert(num2);//undefined
}
doAdd(10);
arguments还有一个属性:callee,它的作用是返回正在被执行的function
例如:
function argumentsTest (a,b) {
alert(arguments.callee);//返回函数本身
}
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返回的是什么呢?
看个例子:
function calleeLengthDemo(arg1, arg2) {
alert("arguments.length:" +arguments.length);//
alert("arguments.callee.length:" +arguments.callee.length);//
}
calleeLengthDemo(1,2,3);
由此可以看出arguments.callee.length返回的是函数定义的参数,即形参。
三、没有重载
ECMAscript函数不能实现重载,不能够定义同样的函数然后通过编译器去根据不同的参数执行不同的函数。
例如:
function addSomeNumber(num1){
return num1 + 100;
}
function addSomeNumber(num2) {
return num2 + 200;
}
var result = addSomeNumber(100); //
alert(result);
function addSomeNumber(num1){
num1+=100;
return num1 + 100;
}
function addSomeNumber(num2) {
return num2 + 200;
}
var result = addSomeNumber(100); //
alert(result);
只要函数名一致(上述例子中的addSomeNumber),ECMAscript就会认为是同一个东西,那么后定义的就会覆盖先定义的。
对于ECMAscript函数来说,我自己本没有参数,你给我什么参数我就接受什么样的参数。
从头开始学JavaScript (七)——函数的更多相关文章
- 从头开始学JavaScript (十二)——Array类型
原文:从头开始学JavaScript (十二)--Array类型 一.数组的创建 注:ECMAscript数组的每一项都可以保存任何类型的数据 1.1Array构造函数 var colors = ne ...
- 从头开始学JavaScript (十一)——Object类型
原文:从头开始学JavaScript (十一)--Object类型 一.object类型 一个object就是一系列属性的集合,一个属性包含一个名字(属性名)和一个值(属性值). object对于在应 ...
- 从头开始学JavaScript (十)——垃圾收集
原文:从头开始学JavaScript (十)--垃圾收集 一.垃圾收集 1.1javascript垃圾收集机制: 自动垃圾收集,执行环境会负责管理代码执行过程中的使用的内存.而在C和C++之类的语言中 ...
- 从头开始学JavaScript (九)——执行环境和作用域
原文:从头开始学JavaScript (九)--执行环境和作用域 一.执行环境:定义了变量或者函数有权访问的其他数据,决定了它们各自的行为.每个执行环境都有与之关联的变量对象. 变量对象:保存着环境中 ...
- 从头开始学JavaScript (八)——变量
原文:从头开始学JavaScript (八)--变量 一.变量分类: 基本类型值:null.undefined.number.string.Boolean: 引用类型值:保存在内存中的对象,如:Obj ...
- 从头开始学JavaScript (六)——语句
原文:从头开始学JavaScript (六)--语句 一.条件分支语句:if 基本格式: if (<表达式1>){ <语句组1>}else if (<表达式2> ...
- 从头开始学JavaScript (五)——操作符(二)
原文:从头开始学JavaScript (五)--操作符(二) 一.乘性操作符 1.乘法:* 乘法操作符的一些特殊规则: 如果操作数都是数值,按照常规的乘法计算,如果乘积超过了ECMAscri ...
- 从头开始学JavaScript (四)——操作符
原文:从头开始学JavaScript (四)--操作符 一.一元操作符 1.自增自减操作符:分为前置型和后置型: 前置型:++a;--a; 后置型:a++;a--; 例: <script typ ...
- 从头开始学JavaScript (二)——变量及其作用域
原文:从头开始学JavaScript (二)--变量及其作用域 一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符 ...
随机推荐
- Cocos2d-x场景功能描述的生命周期
层(Layer)的生命周期函数有例如以下: init().初始化层调用. onEnter().进入层时候调用. onEnterTransitionDidFinish(). 进入层并且过渡动画结束时候调 ...
- 【世外桃源】福音节目 swtychina.com
[世外桃源]福音节目 今天小编满怀热情,带着激动地心情,颤抖的双手,以“大无畏的精神,高山仰止的情操”为大家郑重推荐很好的一个福音节目: <世外桃源>, 哎,不对,貌似从2013年初开始& ...
- 【剑指offer】面试题28:弦乐
def Permutation(data, i): if len( data ) == 0: return # i stand for the start of first part for i in ...
- 在前端一定要了解的HTML,CSS知识
盒子模型 每个盒子都有4个属性:内容(content).填充(padding).边框(border).边界(margin) 每个属性都有四个部分:上.右.下.左 块级元素 内联元素 块级元素(bloc ...
- Windows 驱动发展基金会(九)内核函数
Windows 驱动发展基金会系列,转载请注明出处:http://blog.csdn.net/ikerpeng/article/details/38849861 这里主要介绍3类Windows的内核函 ...
- ICT工作的思考<两>
2周奋战.我负责的LB昨天完成了最后一个模块.最后20日. 一周早于预期,经理说,出乎他的意料.So 奖励表,昨日,管理人员与我们合作,吃烧烤补补身子.我只想说,最后一个喘息. 这两周的生活确挺忙碌的 ...
- 【原版的】Redis事件驱动内核
Redis事件驱动内核 作者:cf (360电商技术组) 概述 Redis实现了自己的事件驱动,与开源事件库libevent.libev一样,都是基于I/O多路复用技术实现的.出于性能和代码精炼双方面 ...
- WPF学习(9)样式和行为
在asp.net世界中,我们的美工人员会为我们准备好静态页面,它注意包括三个部分:html.css和js.而在WPF世界里,也同样有着类似这三个部分的静态页面:Xaml.Style和Behaviors ...
- ssh连接失败,排错经验(转)
一.场景描述 ssh连接服务器,发现连接失败,但是对应服务器的ip能够ping通. 场景: [root@yl-web ~]# ssh root@10.1.101.35 ssh_exchange_ide ...
- 有关windows在调试ODOO8.0有些问题
继Ubuntu建筑物8.0调试环境后,,尝试windows设置开发环境. 最后的调试和开发,或将返回Linux环境,由于前一段时间手贱,改变分区表,该grub搞哈.哎!后来重建mbr,手动检索分区表( ...