// 此前,你可能会使用arguments.callee
(function(x) {
if (x <= 1) return 1;
return x * arguments.callee(x - 1);
})(10);
// 但在严格模式下,有可能就要使用命名函数表达式
(function factorial(x) {
if (x <= 1) return 1;
return x * factorial(x - 1);
})(10);
// 要么就退一步,使用没有那么灵活的函数声明
function factorial(x) {
if (x <= 1) return 1;
return x * factorial(x - 1);
}
factorial(10);
致谢
理查德· 康福德(Richard Cornford),是他率先解释了JScript中命名函数表达式所存在的bug。理查德解释了我在这篇文章中提及的大多数bug,所以我强烈建议大家去看看他的解释。我还要感谢Yann-Erwan Perio和道格拉斯·克劳克佛德(Douglas Crockford),他们早在2003年就在comp.lang.javascript论坛中提及并讨论NFE问题了。
约翰-戴维·道尔顿(John-David Dalton)对“最终解决方案”提出了很好的建议。
托比·兰吉的点子被我用在了“替代方案”中。
盖瑞特·史密斯(Garrett Smith)和德米特里·苏斯尼科(Dmitry Soshnikov)对本文的多方面作出了补充和修正。
英文原文:
参考译文:连接访问 (SpiderMonkey的怪癖之后的章节参考该文)
同步与推荐
本文已同步至目录索引:深入理解JavaScript系列
深入理解JavaScript系列文章,包括了原创,翻译,转载等各类型的文章,如果对你有用,请推荐支持一把,给大叔写作的动力。
您可能感兴趣的文章: