每个函数都是 Function 类型的实例,而且都与其他引用类型一样具有属性和方法。由于函
数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。函数通常是使用函
数声明语法定义的,如下面的例子所示。
function sum (num1, num2) { return num1 + num2; } 这与下面使用函数表达式定义函数的方式几乎相差无几。 var sum = function(num1, num2){ return num1 + num2; };
没有重载
同名的函数,后面的函数会覆盖前面的函数。
函数声明和函数表达式
解析器会率先读取函数声明,并使其在执行
任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真
正被解释执行。请看下面的例子。
alert(sum(10,10)); function sum(num1, num2){ return num1 + num2; }
如果改为函数表达式就会报错
alert(sum(10,10)); var sum = function(num1, num2){ return num1 + num2; };
函数的内部属性
在函数内部,有两个特殊的对象: arguments 和 this。其中, arguments 在第 3 章曾经介绍过,
它是一个类数组对象,包含着传入函数中的所有参数。虽然 arguments 的主要用途是保存函数参数,
但这个对象还有一个名叫 callee 的属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。
请看下面这个非常经典的阶乘函数。
function factorial(num){ if (num <=1) { return 1; } else { return num * factorial(num-1) } }
函数内部的另一个特殊对象是 this,其行为与 Java 和 C#中的 this 大致类似。换句话说, this
引用的是函数据以执行的环境对象——或者也可以说是 this 值(当在网页的全局作用域中调用函数时,
this 对象引用的就是 window)。来看下面的例子。
window.color = "red"; var o = { color: "blue" }; function sayColor(){ alert(this.color); } sayColor(); //"red" o.sayColor = sayColor; o.sayColor(); //"blue"
函数的属性和方法
每个函数都包含两个
属性: length 和 prototype。其中, length 属性表示函数希望接收的命名参数的个数,如下面的例
子所示。
function sayName(name){ alert(name); } function sum(num1, num2){ return num1 + num2; } function sayHi(){ alert("hi"); } alert(sayName.length); //1 alert(sum.length); //2 alert(sayHi.length); //0
及时行乐