javascript 递归的理解及arguments.callee使用


声明:本文转载自https://my.oschina.net/mrlingli/blog/1570491,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

递归函数是在一个函数通过名字调用自身的情况下构成的,如下所示。

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

这是一个经典的递归阶乘函数。但是执行下面的函数的时候却可能导致它出错。

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

以上代码先把 factorial()函数保存到变量 anotherFactorial中,然后将factorial变量设置为 null ,结果指向原始函数的引用只剩下一个。

但在接下来调用 anotherFactorial()时,由于必须执行 factorial(),而factorial已经不是函数,所以会导致错误。

在这种情况下,使用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仍然有效,所以递归调用照样能正确完成。这种方式在严格模式和非严格模式下都行得通。

本文发表于2017年11月10日 10:34
(c)注:本文转载自https://my.oschina.net/mrlingli/blog/1570491,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1851 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1