匿名函数的概念大家也许不会陌生,但是我相信下面的内容会打开一些新的思路。
我们知道函数的定义方式有两种:
1 function fn1(){alert(‘fn1 works’);}
2 var fn2=function(){alert(‘fn2 works’);}
这两种方式有什么区别?思考一下…
1 第一种方式定义函数,函数声明过程在整个程序执行之前的预处理就完成了,所以只要处于同一个作用域,就可以访问到,即使在定义之前调用它也可以。
2 第二章方式就是匿名函数,这种方式函数只能按照程序流程执行到定义的那一行代码才被声明,所以只能在定义之后调用它。
举个例子
var fn1;
fn1();//报错
fn1=function(){
fn2();//fn2 works
alert(‘fn1 works’);
return false;
function fn2(){
alert(‘fn2 works’);
}
}
fn1();//fn2 works + fn1 works
我们看到fn2虽然处在return之后,程序流程并没有执行到它,但是它依然可以被使用,反之fn2只有在它被定义之后才会被正常执行。
明白了这个,下面看一看匿名函数在递归里用处
递归就是函数内部调用自己,举个例子
function fn1(n){return n>2?fn1(n-1)+fn1(n-2):n;}
当我们想把这个函数赋给其他的对象属性时,就要用到匿名函数,比如
obj1={
fn:function(n){
return n>2?obj1.fn(n-1)+obj1.fn(n-2):n;}}obj2={fn:obj.fn;}
obj1={}obj2.fn();
obj1={
fn:function(n){
return n>2?this.fn(n-1)+this.fn(n-2):n;}}
obj1={
fn:function fnname(n){
return n>2?fnname(n-1)+fnname(n-2):n;}}
obj1={
fn:function(n){
return n>2?arguments.callee(n-1)+arguments.callee(n-2):n;}}