递归函数,在前面的博客中已经简单的介绍了。递归函数是一个通过函数名称在函数内部调用自身的函数。如下:

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

  上面的代码,在第一行声明了一个fac函数,同时在6行调用了fac函数本身。这是一个求阶乘的递归函数。

 var anthorfacc=fac;
fac=null;
anthorfacc(4);//抛出异常

  上面的代码,在第一行声明了一个变量anthorfacc,并指向fac。第2行将fac设置null,这样anthorfacc也同样为null。第3行调用的时候会抛出异常,因为在求阶乘的时候要两次调用fac函数,但是fac设置为null之后,事实上fac的引用只剩一个。此时,在函数内部调用fac会报错。在这种情况下,使用arguments.callee可以解决上面的问题。

  arguments.callee是一个指向执行函数的指针,可以用这个方法实现函数的递归调用。

 function fac(num){
if(num<1){
return 1;
}
else{
return num*arguments.callee(num-1);
}
}
var anthorfacc=fac;
fac=null;
var jie=anthorfacc(4);
console.log(jie);//

  上面的代码用arguments.callee代替了函数本身,即使将fac设置为null,依然不会报错。但是在es5中的严格模式是不允许使用callee方法,访问这个属性会报错。可以使用命名函数表达式来表达相同的结果。

 var fac=(function f(num){
if(num<1){
return 1;
}
else{
return num*fac(num-1);
}
});
var anthorfacc=fac;
fac=null;
var jie=anthorfacc(4);
console.log(jie);//

  上面的代码创建了一个名为f的命名函数表达式,然后将它的值赋给fac。即使将函数fac赋值给另外一个变量,函数f依然有效,所以递归函数依然有效。这种使用在严格模式和非严格模式都可以使用。

浅谈JavaScript的函数表达式(递归)的更多相关文章

  1. 浅谈JavaScript的函数表达式(闭包)

    前文已经简单的介绍了函数的闭包.函数的闭包就是有权访问另一个函数作用域的函数,也就是函数内部又定义了一个函数. var Super=function(num){ var count=num; retu ...

  2. 浅谈JavaScript eval() 函数

    用js的人都应该知道eval()函数吧,虽然该函数用的极少,但它却功能强大,那么问题来了,为什么不常用呢?原因很简单,因为eval()函数是动态的执行其中的字符串,里面有可能是脚本,那么这样的话就有可 ...

  3. 浅谈JavaScript匿名函数与闭包

    一. 匿名函数   //普通函数定义: //单独的匿名函数是无法运行的.就算运行了,也无法调用,因为没有名称. 如: function(){             alert('123');    ...

  4. 浅谈javascript的函数节流

    什么是函数节流? 介绍前,先说下背景.在前端开发中,有时会为页面绑定resize事件,或者为一个页面元素绑定拖拽事件(其核心就是绑定mousemove),这种事件有一个特点,就是用户不必特地捣乱,他在 ...

  5. 浅谈JavaScript的函数的call以及apply

    我爱撸码,撸码使我感到快乐!大家好,我是Counter.今天就来谈谈js函数的call以及apply,具体以代码举例来讲解吧,例如有函数: function func(a, b) { return a ...

  6. 浅谈javascript函数节流

    浅谈javascript函数节流 什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等 ...

  7. [转载]浅谈JavaScript函数重载

     原文地址:浅谈JavaScript函数重载 作者:ChessZhang 上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都 ...

  8. 浅谈 JavaScript 编程语言的编码规范

    对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...

  9. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

随机推荐

  1. Python第三方库之openpyxl(5)

    Python第三方库之openpyxl(5) 气泡图 气泡图类似于散点图,但使用第三个维度来确定气泡的大小,图表可以包括多个项目 from openpyxl import Workbook from ...

  2. php在字符串中替换多个字符

    php替换多个字符串str_replace函数 echo str_replace(array("m","i"),array("n",&quo ...

  3. 【C#】C#数据类型和VB的区别

    导读:看完了C#,需要总结的有很多东西.开始没有怎么在意,根本没有意识到,那些视频是教给了我一种新的编程语言,我就真的是像看电视剧一样的看完了.猛然想起了学过的VB,这是目前为止,我接触到的仅有的语言 ...

  4. iOS学习笔记15-序列化、偏好设置和归档

    一.本地持久化 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件( ...

  5. BZOJ3473 字符串 【广义后缀自动机】

    题目 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? 输入格式 第一行两个整数n,k. 接下来n行每行一个字符串. 输出格式 一行n个整数,第i个整数表 ...

  6. Spoj-BIPCSMR16 Team Building

    To make competitive programmers of BUBT, authority decide to take regular programming contest. To ma ...

  7. uva 10561 sg定理

    Problem C Treblecross Input: Standard Input Output: Standard Output Time Limit: 4 Seconds Treblecros ...

  8. Laravel5.1 报错:控制器不存在

    Laravel5.1 报错:控制器不存在 错误提示: Class App\Http\Controllers\Api/UserController does not exist 解决: (1)检查控制器 ...

  9. Linux查看系统状态命令top

    用法 top 自动刷新系统状态,要结束使用[Ctrl]+[C] 效果图: 信息解释(转自百度经验http://jingyan.baidu.com/article/4d58d5412917cb9dd4e ...

  10. configure: error: Cannot find php_pdo_driver.h.

    安装pdo_mysql cd /usr/local/src/php-5.4.0/ext/pdo_mysql/ /usr/local/php/bin/phpize   # /usr/local/php为 ...