现在,一步一步,摩擦摩擦,在皎洁的编辑器上,来开始使用javascript写递归函数吧!function fun(num){if(num <= 1){return 1;} else{return num * fun(--num); }}好了,不错,一个堪称经典的递归求阶乘的函数诞生了。事情肯定不会这么顺利,一定是个圈套。我们来如下调用以下看看会怎么样?var test = fun;fun = null;console.log(test(7));呵呵,居然报错了Uncaught TypeError: object is not a function嗯,报了类型错误。。。回过头去看看我们是如何调用的。发现问题了吧!我们把fun赋给了test,然后把fun给回收掉了。为什么会出错呢?因为像function这种赋值其实是引用传递,只是把指向函数的指针(这里说地址也行)赋给test了。但我们把fun赋值为null的时候,函数都已经被回收了,拿什么来执行?知道问题所在了,我决定换种方式来定义:function fun(num){if(num <= 1){return 1;} else{return num * arguments.callee(--num); }}然后测试一下:var test = fun;fun = null;console.log(test(7));OK,测试通过!但是在某一天,当我实际码代码的时候,问题又出现了。什么问题呢?我们来看一下:Uncaught TypeError: "caller", "callee", and "arguments" properties may not be accessed on strict mode functions or the arguments objects for calls to them ╮(╯▽╰)╭哎!可怜啊!因为我使用了"use strict"!严格模式下是不允许的。。。好吧!继续想办法!既然不能使用arguments.callee(),那还是想想其他的方式吧。看下面的代码:var fun = (function f(num){if(num <= 1){return 1;} else{return num * f(--num); }});然后我测试了以下,神奇的通过了,暂时没有发现任何问题!为什么呢?因为我们使用了“()”,巧妙地使用命名函数表达式来达到了同样的效果。