博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【JS 函数】递归函数 之 arguments.callee
阅读量:4093 次
发布时间:2019-05-25

本文共 912 字,大约阅读时间需要 3 分钟。

传统递归阶乘函数:

function factorial(num){
if (num <= 1){
return 1; } else {
return num * factorial(num-1); }}

虽然这个函数表面看来没什么问题,但下面的代码却可能导致它出错。

var anotherFactorial = factorial; factorial = null;alert(anotherFactorial(4)); //出错!

当把递归函数保存为其他变量名时,由于在函数内部使用了 原函数名,导致错误,这时我们可以通过 使用 arguments.callee 可以解决这个问题。

arguments.callee 是一个指向正在执行的函数的指针,因此可以用它来实现对函数 的递归调用, 上例可以修改为:

function factorial(num){
if (num <= 1){
return 1; } else {
return num * arguments.callee(num-1); } }

通过使用 arguments.callee 代替函数名,可以确保无论怎样调用函数都不会 出问题。因此,在编写递归函数时,使用 arguments.callee 总比使用函数名更保险。

但在严格模式下,不能通过脚本访问 arguments.callee,访问这个属性会导致错误。不过,可 以使用命名函数表达式来达成相同的结果。

var factorial = (function f(num){
if (num <= 1){
return 1; } else {
return num * f(num-1); } });

以上代码创建了一个名为 f()的命名函数表达式,然后将它赋值给变量 factorial。即便把函数 赋值给了另一个变量,函数的名字 f 仍然有效,所以递归调用照样能正确完成。这种方式在严格模式和 非严格模式下都行得通。

转载地址:http://cxvii.baihongyu.com/

你可能感兴趣的文章
MySQL的索引
查看>>
今天,Python信息量很大!
查看>>
Flash 已死,Deno 当立?
查看>>
编程差的程序员,90%都是吃了数学的亏!骨灰级开发:方法不对,努力也白费...
查看>>
编程差的程序员,90%都是吃了数学的亏!骨灰级开发:方法不对,努力也白费...
查看>>
都无代码了,还要程序员吗?
查看>>
程序员:凭自己能力吃饭,有什么理由瞧不起?
查看>>
面试想拿 10K,HR 说我只配7k?
查看>>
副业过万的程序员都知道的网站有哪些
查看>>
那些人生“开挂”的程序员,都在干什么?
查看>>
影响科学圈的那些计算机代码
查看>>
乐视视频 App 图标改为“欠 122 亿”,网友:我在别家分红包,却在你家随份子!...
查看>>
乔布斯18岁求职信拍卖价22.24万美元,值吗?
查看>>
为何程序员总喜欢写技术博客,看完恍然大悟...
查看>>
假如计算机是中国人发明的,那代码应该这么写
查看>>
科技公司最爱的 50 款开源工具,你都用过吗?
查看>>
触目惊心:比特币到底消耗了多少能源?
查看>>
面试官:简历上敢写技术精通?那我就不客气了!
查看>>
如何判断一家互联网公司要倒闭了?
查看>>
想快速上手机器学习?来看下这个 GitHub 项目!
查看>>