function-expression

1.递归

递归函数实在一个函数调用名字来调用自身的情况下构成的。经典递归函数:

1
2
3
4
5
6
7
function factorial(num){
if(num <= 1){
return 1;
}else{
return num * factorial(num-1);
}
}

虽然看起来没问题,但是

1
2
3
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(5)); // error,因为anotherFactorial函数重的factorial已设置为null。

解决方法: arguments.callee代表正在执行的函数指针,但是在严格模式下会出错。

1
2
3
4
5
6
7
function factorial(num){
if(num <= 1){
return 1;
}else{
return num * arguments.callee(num-1);
}
}

解决办法:可以使用命名函数表达式

1
2
3
4
5
6
7
var factorial = (function f(num){
if(num <= 1){
return 1;
}else{
return num * f(num-1);
}
});

2. 闭包

闭包是有权访问另外一个函数作用域中变量的函数。常见创建方式就是在一个函数中创建另外一个函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function createComparisonFunction(propertyName) {

return function(object1, object2){
var value1 = object1[propertyName];
var value2 = object2[propertyName];

if (value1 < value2){
return -1;
} else if (value1 > value2){
return 1;
} else {
return 0;
}
};
}

当某个函数被调用时,会创建一个执行环境及相应的作用域链。然后使用arguments和其他命名参数来初始化函数活动对象。但在作用域中外部函数活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三位,……直至作为作用于链的全局环境。