浅谈JavaScript的函数表达式(递归)
递归函数,在前面的博客中已经简单的介绍了。递归函数是一个通过函数名称在函数内部调用自身的函数。如下:
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的函数表达式(递归)的更多相关文章
- 浅谈JavaScript的函数表达式(闭包)
前文已经简单的介绍了函数的闭包.函数的闭包就是有权访问另一个函数作用域的函数,也就是函数内部又定义了一个函数. var Super=function(num){ var count=num; retu ...
- 浅谈JavaScript eval() 函数
用js的人都应该知道eval()函数吧,虽然该函数用的极少,但它却功能强大,那么问题来了,为什么不常用呢?原因很简单,因为eval()函数是动态的执行其中的字符串,里面有可能是脚本,那么这样的话就有可 ...
- 浅谈JavaScript匿名函数与闭包
一. 匿名函数 //普通函数定义: //单独的匿名函数是无法运行的.就算运行了,也无法调用,因为没有名称. 如: function(){ alert('123'); ...
- 浅谈javascript的函数节流
什么是函数节流? 介绍前,先说下背景.在前端开发中,有时会为页面绑定resize事件,或者为一个页面元素绑定拖拽事件(其核心就是绑定mousemove),这种事件有一个特点,就是用户不必特地捣乱,他在 ...
- 浅谈JavaScript的函数的call以及apply
我爱撸码,撸码使我感到快乐!大家好,我是Counter.今天就来谈谈js函数的call以及apply,具体以代码举例来讲解吧,例如有函数: function func(a, b) { return a ...
- 浅谈javascript函数节流
浅谈javascript函数节流 什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等 ...
- [转载]浅谈JavaScript函数重载
原文地址:浅谈JavaScript函数重载 作者:ChessZhang 上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都 ...
- 浅谈 JavaScript 编程语言的编码规范
对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
随机推荐
- 基于注解实现SpringBoot多数据源配置
1.功能介绍 在实际的开发中,同一个项目中使用多个数据源是很常见的场景.最近在学习的过程中使用注解的方式实现了一个Springboot项目多数据源的功能.具体实现方式如下. 2.在applicatio ...
- 82. Spring Boot – 启动彩蛋【从零开始学Spring Boot】
我们在[28. SpringBoot启动时的Banner设置 ] 这一小节介绍过设置Spring Boot的Banner,但是实际当中,我们希望做的更漂亮,所以也就有了这小节Spring Boot-启 ...
- 利用ps,grep,kill联合杀掉相关进程
#!/bin/sh . "./set-server-env.sh" 这里是输出ps -ef |grep java 结果的第二列的内容然后通过xargs传递给kill -9,其实第二 ...
- 【bzoj1710】[Usaco2007 Open]Cheappal 廉价回文
[bzoj1710][Usaco2007 Open]Cheappal 廉价回文 Description 为了跟踪所有的牛,农夫JOHN在农场上装了一套自动系统. 他给了每一个头牛一个电子牌号 当牛走过 ...
- VirtualBox 下主机与虚拟机以及虚拟机之间互通信配置
引用链接:1)http://www.it165.net/os/html/201401/7063.html 2)http://www.cnblogs.com/sineatos/p/4489620.htm ...
- rest-assured 将log()中的信息打印到log日志中去的方法
rest-assured 将log()中的信息打印到log日志中去的方法: ============方法1============== PrintStream fileOutPutStream = n ...
- 同时在windows和linux环境开发时换行符的处理
Git 的 core.autocrlf 參數默认为true,即每次 checkin 時,Git 會將純文字類型的檔案中的所有 CRLF 字元轉換為 LF,也就是版本庫中的換行符號一律存成 LF:在 c ...
- android studio AndroidManifest
一.目录结构 1. AndroidManifest.xml 它是一个清单文件,提供应用的基本信息 <?xml version="1.0" encoding="utf ...
- P1536 村村通 洛谷
https://www.luogu.org/problem/show?pid=1536 题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府“村村通工程”的 ...
- avi视频文件提取与合并
最近在做一个avi视频文件的提取与合并,花了几天熟悉avi文件格式.制作了一个提取与合并的动态库,不过仅限于提取视频,视频的合并还没添加一些额外判断,可能导致不同分辨率的视频文件合成后不能播放.欢迎大 ...