《JavaScript高级程序设计》学习笔记(函数)

《JavaScript高级程序设计》学习笔记(函数) 

函数

函数是一组可以随时随地运行的语句,它们是ECMAScript的核心。
函数是由关键字function、函数名加一组参数以及置于括号中的要执行的代码声明的。
基本语法:
function functionname([arg1 [, arg2 [,...[, argN]]]])
{
   statements
}

函数可以通过其名字加置于括号中的参数(如果有多个参数,中间用逗号分隔)调用。
调用函数基本语法:
functionname([arg1 [, arg2 [,...[, argN]]]])

函数有没有返回值,都不必明确地声明它。即使有,只需要使用return运算符后跟要返回的值即可。

函数在执行过return语句后停止执行代码。因此,return语句后的代码都不会被执行。

如果函数无返回值,那么可以调用没有参数的return运算符,随时退出函数。

如果函数无明确的返回值,或调用了没有参数的return语句,那么它真正返回的值是undefined。

 

无重载

ECMAScript中的函数不能重载。
可用相同的名字在同一个作用域中定义两个函数,而不会引发错误,但真正使用的是后一个函数。
例子:
function doAdd(n){
 return n+100;
}
function doAdd(n){
 return n+10;
}
alert(doAdd(10));
结果显示"20",因为第二个doAdd()函数的定义覆盖了第一个定义

 

arguments对象

在函数代码中,使用特殊对象arguments,开发者无需明确指出参数名,就能访问它们。
第一个参数位于位置0,第二个参数位于位置1,依此类推
例子:
function doAdd(){
 return arguments[0]+arguments[1];
}
alert(doAdd(10,20));
用arguments[0]表示第一个参数"10",arguments[1]表示第二个参数"20",结果是"30"

可用arguments对象检测传递给函数的参数个数,

引用属性arguments.length,可以检测传递给函数的参数个数
function doAdd(){
 return arguments.length;
}
alert(doAdd(10,20));
结果是"2"

ECMAScript不会验证传递给函数的参数个数是否等于函数定义的参数个数。
开发者定义的函数都可以接受任意个数的参数(根据Netscape的文档,最多能接受25个),而不会引发任何错误。任何遗漏的参数都会以undefined传递给函数,多余的参数将忽略。

用arguments对象判断传递给函数的参数个数,还可以模拟函数重载

 

Function类

Function类可以表示开发者定义的任何函数。
用Function类直接创建函数的语法:
var function_name = new Function([arg1 [, arg2 [,...[, argN]]]],function_body);

每个arg都是一个参数,最后一个参数是函数主体(要执行的代码),这些参数必须是字符串
例子:
var doAdd = new Function("n","return n+100;");

这里说明函数只是一种引用类型,这也说明了为什么第二个函数的定义覆盖了第一个的定义
例子:
var doAdd = new Function("n","return n+100;");
var doAdd = new Function("n","return n+10;");
显然第二个doAdd函数的定义会覆盖第一个的定义

函数名只是指向函数对象的引用值,行为就像其他指针一样,甚至可以使两个变量指向同一个函数
例子:
var doAdd = new Function("n","return n+10;");
var num = doAdd;
alert(doAdd(10));
alert(num(10));
都是显示"20"

可以把函数作为参数传递给另一个函数
例子:
function nAdd(n){
 return n+10;
}
function doAdd(fun_name,n){
 return fun_name(n);
}
alert(doAdd(nAdd,10));
将显示"20"

注意:最好不要使用Function构造函数创建函数,因为用它定义函数比用传统方式要慢得多。不过,所有函数都应看作是Function类的实例。


因为函数是引用类型,所以它们也有属性和方法。
length 属性 返回函数定义的参数数目
functionName.length
例子:
function nAdd(n,m){}
alert(nAdd.length);
显示"2"

注意:无论定义了几个参数,ECMAScript函数可以接受任意多个参数(最多25个)。属性length只是为查看默认情况下预期的参数个数提供了一种简便的方式。

Function对象也有与所有对象共享的标准valueOf()方法和toString()方法。
这两个方法返回的都是函数的源代码,在调试时尤其有用。
例子:
function nAdd(n){
 return n+10;
}
alert(nAdd.valueOf());
alert(nAdd.toString());
这两个方法都输出了nAdd()函数的文本内容

还有两个Function类的方法与对象的讨论相关,下一章将讨论它们。

 

闭包

ECMAScript最容易让人误解的一点是它支持闭包(closure)。
闭包是指词法表示包括不必计算的变量的函数,也就是说,该函数能使用函数外定义的变量。
在ECMAScript中使用全局变量是一个简单的闭包实例。

例子:
var iBaseNum = 10;
function addNumbers(iNum1, iNum2) {
     function doAddition() {
          return iNum1 + iNum2 + iBaseNum;
     }
     return doAddition();
}
alert(addNumbers(3, 6));

将显示"19",这里,函数addNumbers()包括函数doAddition()(闭包)。内部函数是个闭包,因为它将获取外部函数的参数iNum1和iNum2以及全局变量iBaseNum的值。addNumbers()的最后一步调用了内部函数,把两个参数和全局变量相加,并返回它们的和。这里要掌握的重要概念是doAddition()函数根本不接受参数,它使用的值是从执行环境中获取的。

可以看到,闭包是ECMAScript中非常强大多用的一部分,可以用于执行复杂的计算。就像使用任何高级函数一样,在使用闭包时要当心,因为它们可能会变得非常复杂。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值