函数的引用

函数是ECMAScript中最有意思的部分之一,这主要是因为函数实际上是对象。每个函数都是Function 类型的实例,而 Function 也有属性和方法,跟其他引用类型一样。因为函数是对象,所以函数名就是指向函数对象的指针,而且不一定与函数本身紧密绑定。函数通常以函数声明的方式定义,比如:

注意函数定义最后没有加分号。

另一种定义函数的语法是函数表达式。函数表达式与函数声明几乎是等价的:

这里,代码定义了一个变量 sum 并将其初始化为一个函数。注意 function 关键字后面没有名称, 因为不需要。这个函数可以通过变量 sum 来引用。 注意这里的函数末尾是有分号的,与任何变量初始化语句一样。

最后一种定义函数的方式是使用 Function 构造函数。这个构造函数接收任意多个字符串参数,最 后一个参数始终会被当成函数体,而之前的参数都是新函数的参数。来看下面的例子:

我们不推荐使用这种语法来定义函数,因为这段代码会被解释两次:第一次是将它当作常规 ECMAScript 代码,第二次是解释传给构造函数的字符串。这显然会影响性能。不过,把函数想象对象,把函数名想象为指针是很重要的。而上面这种语法很好地诠释了这些概念。

函数名

因为函数名就是指向函数的指针,所以它们跟其他包含对象指针的变量具有相同的行为。这意味着一个函数可以有多个名称,如下所示:

以上代码定义了一个名为 sum()的函数,用于求两个数之和。然后又声明了一个变量 anotherSum

并将它的值设置为等于 sum。注意,使用不带括号的函数名会访问函数指针,而不会执行函数。

此时, anotherSum sum 都指向同一个函数。调用 anotherSum()也可以返回结果。把 sum 设置为 null 之后,就切断了它与函数之间的关联。而 anotherSum()还是可以照常调用,没有问题。

理解参数

ECMAScript 函数的参数跟大多数其他语言不同。ECMAScript 函数既不关心传入的参数个数,也不

关心这些参数的数据类型。定义函数时要接收两个参数,并不意味着调用时就传两个参数。你可以传

一个、三个,甚至一个也不传,解释器都不会报错。

之所以会这样,主要是因为 ECMAScript 函数的参数在内部表现为一个数组。函数被调用时总会接收一个数组,但函数并不关心这个数组中包含什么。如果数组中什么也没有,那没问题;如果数组的元 素超出了要求,那也没问题。事实上,在使用 function 关键字定义(非箭头)函数时,可以在函数内部访问 arguments 对象,从中取得传进来的每个参数值。

arguments 对象是一个类数组对象(但不是 Array 的实例),因此可以使用中括号语法访问其中的 元素(第一个参数是 arguments[0],第二个参数是 arguments[1])。而要确定传进来多少个参数可以访问 arguments.length 属性。

在下面的例子中,sayHi()函数的第一个参数叫 name

可以通过 arguments[0]取得相同的参数值。因此,把函数重写成不声明参数也可以:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值