Function类型
函数实际上是对象,每个函数都是 Function 类型的实例,函数名实际上也是一个指向函数对象的指针。
2.5.1 函数声明
有两种方式:函数声明 和 函数表达式
function sum(num1, num2) {
return num1 + num2;
}
var sum = function(num1, num2) {
return num1 + num2;
}
PS1: 这两种方式效果是一样的,但解析器会率先读取函数声明,并在其执行代码之前可用;而函数表达式必须等到解析器执行到它所在的代码行,才会真正被解释执行。
PS2: 如果声明了两个同名函数,则后面的覆盖前面的。
2.5.2 函数内部属性
在函数内部,有两个特殊的对象:arguments 和 this。其中前者是一个类数组对象,包含这传入函数中的所有参数;后者引用的是函数执行的环境对象。
arguments 对象还有一个 callee 属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。可以利用这个属性写一个经典的阶乘函数
function factorial(num) {
if (num <= 1) {
return 1;
} else {
return num * arguments.callee(num - 1);
//return num * factorial(num - 1);
}
}
console.log(factorial(5)); //120
函数中的 this 代表函数执行的环境
var color = 'red';
function sayColor() {
alert(this.color);
}
sayColor(); //red
2.5.3 函数属性和方法
每个函数都包含两个属性:length 和 prototype。
length 属性表示函数希望接收的命名参数的个数
function sayName(name) {
alert(this.name);
}
function sun(num1, num2) {
return num1 + num2;
}
alert(sayName.length); //1
alert(sun.length); //2
在 ECMAScript 核心所定义的全部属性中,最耐人寻味的就是 prototype 了。对于引用类型而言,prototype 是保存他们所有实例方法的真正所在。在创建自定义引用类型以及实现继承时,这个属性是及其重要的。
每个函数都有两个方法:apply() 和 call(),用途都是在特定的作用域中调用函数(实际上等于设置函数体内 this 对象的值)。他们的区别仅仅在于接收参数的方式不同。
function sun(num1, num2) {
return num1 + num2;
}
function callSum(num1 + num2) {
return sum.apply(this, arguments);
//return sun.call(this, num1, num2);
}
上面这个用法并不是他们真正的用武之地
var color = 'red';
var color = 'red';
var o = { color: 'blue' };
function sayColor() {
alert(this.color);
}
sayColor(); //red
sayColor.call(o); //blue