1.概述
javascript有三种方法可以声明一个函数。
function命令后跟函数名,函数名后跟一个小括号,小括号里可以放参数,函数体放在大括号里。这叫做函数的声明(Function Declaration)。
除了用function命令声明函数,还可以采用变量赋值的写法。这种写法将一个匿名函数赋值给变量。这时,这个匿名函数又称函数表达式(Function Expression),因为赋值语句的等号右侧只能放表达式。
还有第三种声明函数的方式:Function构造函数。
你可以传递任意数量的参数给Function构造函数,只有最后一个参数会被当做函数体,如果只有一个参数,该参数就是函数体。Function构造函数可以不使用new命令,返回结果完全一样。总的来说,这种声明函数的方式非常不直观,几乎无人使用。
2.函数的属性和方法
name 属性返回紧跟着function关键字之后的那个函数名。
length属性返回函数预期传入的参数个数,即函数定义之中的参数个数。
函数的toString方法返回函数的源码。
3.函数的作用域
作用域(scope)指的是变量存在的范围。Javascript只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。
在函数内部定义的变量,外部无法读取,称为“局部变量”(local variable)。
注意,对于var命令来说,局部变量只能在函数内部声明,在其他区块中声明,一律都是全局变量。
与全局作用域一样,函数作用域内部也会产生“变量提升”现象。var命令声明的变量,不管在什么位置,变量声明都会被提升到函数体的头部。
总之,函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域。
很容易犯错的一点是,如果函数A调用函数B,却没考虑到函数B不会引用函数A的内部变量。
4.参数
函数运行的时候,有时需要提供外部数据,不同的外部数据会得到不同的结果,这种外部数据就叫参数。
数参数不是必需的,Javascript允许省略参数。
被省略的参数的值就变为undefined。需要注意的是,函数的length属性与实际传入的参数个数无关,只反映函数预期传入的参数个数。
但是,没有办法只省略靠前的参数,而保留靠后的参数。如果一定要省略靠前的参数,只有显式传入undefined。
如果有同名的参数,则取最后出现的那个值。
由于JavaScript允许函数有不定数目的参数,所以我们需要一种机制,可以在函数体内部读取所有参数。这就是arguments对象的由来。
arguments对象包含了函数运行时的所有参数,arguments[0]就是第一个参数,arguments[1]就是第二个参数,以此类推。这个对象只有在函数体内部,才可以使用。
需要注意的是,虽然arguments很像数组,但它是一个对象。数组专有的方法(比如slice和forEach),不能在arguments对象上直接使用。
但是,可以通过apply方法,把arguments作为参数传进去,这样就可以让arguments使用数组方法了。
网友评论