一、es5中函数定义的两种形式:
1.函数声明
function a() {
//here is you code
}
2.函数表达式
var a = function() {
//here is your code
}
首先要明确的一点是,在es5中,函数是一种对象(object),或者说,函数是Object类的子类
a instanceof Function //true
a instanceof Object //true
函数声明有一个非常重要的特征,函数声明提升,意思是,在执行代码之前会先对函数声明进行读取
sayHi();
function sayHi() {
console.log("hi!");
}
// hi!
而函数表达式则会把函数定义当作一个一般意义上的变量进行提升处理
sayHi();
var sayHi = function(argument) {
console.log("hi!");
}
// Uncaught TypeError: sayHi is not a function(…)
二、使用arguments.callee(类数组的arguments指向所在的函数的指针)来对函数进行递归调用,来达到解耦的目的。但是在严格模式下访问arguments.callee会出现错误(不允许访问),所以有一个更好的解决方案:命名函数表达式
下面是阶乘函数的两种实现
function factorial(num) {
if(num<=1){
return 1;
}else{
return num*factorial(num-1);
}
}//与函数名factorial存在强耦合,不佳!
function factorial(num) {
if(num<=1){
return 1;
}else{
return num*arguments.callee(num-1);
}
}//不与函数名耦合
var factorial = (function f(num){
if(num<=1)
return 1;
}else{
return num*f(num-1);
}
});//命名函数表达式