先举例:

function factorial(num)
{
if (num <= ) {
return num;
}
else {
return num * factorial(num-);
}
} //输出120 //进一步去思考
有名字的函数,且名字不会有变化的情况下,这样定义没有问题。
若名字有变化呢,这里就需要考虑到 需要 【消除】 这种 【紧密耦合】
function factorial(num)
{
  if(num<=1)
{
return 1;
}
else{
return num * arguments.callee(num-1);
}
}
//使用 arguments.callee来解决 注释:argument是一个很大的对象,每次调用都需要重新创建 会影响浏览器的性能 还会影响 闭包

我们知道arguments.callee是一个指向正在执行的函数的指针 (若不理解arguments可以看下面的)

function factorial(num) {
if (num <= ) {
return ;
} else {
return num * arguments.callee(num - );
}
}
var trueFactorial = factorial;
alert(trueFactorial()); //120
//注释:可以在此处 中 的浏览器调试 看 factorial对象
factorial = function () {
return ;
}
//注释:可以在此处中 的浏览器调试 看 trueFactorial 和 factorial对象
alert(trueFactorial());// 120 如果没有使用arguments.callee,将返回0 function mm() {
alert(factorial()); //0
alert(trueFactorial());//120 } 思考:arguments.callee指向arguments对象的拥有函数引用,当把factorial函数的引用赋给trueFactorial后,arguments对象的拥有函数变成了tureFactorial

什么是arguments ?

arguments是类数组对象,和数组有很多共性。

function showargs(){
console.log(arguments)
}
showargs(1,2,3,4);
//得到的结果如图
从图片来看
arguments对象的 ==proto==是指向的object,说明了是一个类数组对象

ES4添加了严格模式,在严格模式中禁止不使用var来直接声明一个全局变量,而且arguments也被禁用了

回到正题,上面讲述了递归时的解耦,通过使用arguments.callee来解决,但是在严格模式下是不能访问arguments.callee,那此时有没有解决方案呢?

//可以通过命名函数表达式来达成相同的结果
var factorial=(function f(num){
if(num<=){
return ;
}
else
{
return num* f(num-)
}
})

javascript 之 第七章第一节(递归)的更多相关文章

  1. Ionic 入门与实战之第二章第一节:Ionic 环境搭建之开发环境配置

    原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第二章第一节,主要对 Ionic 的开发环境配置做了简要的介绍,本文介绍的开发环境为 Mac 系统,Windows 系统基本类似,少许 ...

  2. 读《编写可维护的JavaScript》第七章总结

      第七章 事件处理 7.1 典型用法 作者首先给了个我们一个处理事件的方法.看起来也没啥俩样,不过后来给出的优化方法很值得学习: // 不好的写法 function handleClick(even ...

  3. c语言第一章第一节 认识变量

    声明:本人大一新生,闲着无聊..写写c语言教程..菜鸟一枚..大神勿喷!!! 接下来我们都用dev来进行编译..vc++太古老了,没提示功能,不好上手,并且老是出毛病..vs太大了,编个c不至于,运行 ...

  4. Zabbix简介(第一章第一节)

    Alexei Vladishev创建了Zabbix项目,当前处于活跃开发状态,Zabbix SIA提供支持. Zabbix是一个企业级的.开源的.分布式的监控套件 Zabbix可以监控网络和服务的监控 ...

  5. 前端:CSS第四章第一节

    块级元素一行只有一个,比如P标签 CSS层叠样式表,意思就是样式是可以叠加的,比如下面的代码 <style> .ok{ color: aqua; } .blue{ color: #5283 ...

  6. tensorflow2.0学习笔记第一章第一节

    一.简单的神经网络实现过程 1.1张量的生成 # 创建一个张量 #tf.constant(张量内容,dtpye=数据类型(可选)) import tensorflow as tf import num ...

  7. 第七课第一节,T语言流程语句( 版本5.0)

    流程语句 if语句 用if语句可以构成分支结构.它根据给定的条件进行判断,以决定执行某个分支程序段.TC综合开发工具的if语句有三种基本形式,并且每个语句的结尾都要有一个end (注:关键字,if,e ...

  8. 字典 -- 数据结构与算法的javascript描述 第七章

    字典 字典是一种以键-值对形式存储数据的数据结构 最基本功能规划 add 添加数据到字典 remove 从字典中移除数据 get 从字典中取出数据 count 统计字典数据量 find 查找数据在字典 ...

  9. JAVAscript学习笔记 js事件 第一节 (原创) 参考js使用表

    <!DOCTYPE html> <html lang="en" onUnload="ud()"> <head> <me ...

随机推荐

  1. SpringBoot 2.x.x会拦截静态资源问题

    之前在看尚硅谷视频时,可谓是按照这老师的说法,一步一步按部就班,于是采坑了,在SpringBoot 2.x.x之前是不会对静态资源拦截的,但是现在已经普通使用2.x.x这个版本会对静态资源进行拦截.看 ...

  2. redis 3.2 新数据结构:quicklist、String的embstr与raw编码方式分界点

    Redis3.2.0引入了新的quicklist的数据结构做了list的底层存储方案.废弃了原来的两个配置参数, list-max-ziplist-entries list-max-ziplist-v ...

  3. 千万不要随意在网上下载ojdbcjar包来使用,ORA-01461错误解决

    我在登录项目时,点击某一按钮提示ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值,但是项目在我的同事那里可以完好运行.最后百度 发现问题所在: 数据库与客户端的JDBC驱动不匹配. ...

  4. 【技巧】-NO.123.数据处理技巧

    Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...

  5. python爬虫中scrapy框架是否安装成功及简单创建

    判断框架是否安装成功,在新建的爬虫文件夹下打开盘符中框输入cmd,在命令中输入scrapy,若显示如下图所示,则说明成功安装爬虫框架: 查看当前版本:在刚刚打开的命令框内输入scrapy versio ...

  6. Oracle 中 编写 function 和 procedure 的注意事项

    create or replace function sum_pro( v_a number, v_b number ) return number is -- v_result number(10) ...

  7. 不支持iframe框架?出来吧pdf

    <iframe src='http://km.shengaitcm.com/ADC/_layouts/15/WopiFrame.aspx?sourcedoc=%2FADC%2FDocLib6%2 ...

  8. 微信公众平台开发教程(三)_OAuth2.0认证

    一.微信授权认证 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权的两种scope的区别说明 1.以snsapi_base为s ...

  9. luogu P3197 [HNOI2008]越狱

    构造长度为n的串,给定m种颜色,求使得相邻两位的颜色相同的方案数 显然可以看出长度为n的串染m种颜色的总方案数为$m^{n}$ 然后来考虑相邻两位颜色不同的方案 对于第一位,有m种选择 对于剩余的n- ...

  10. centos7安装nginx1.10.1

    安装nginx. 1.首先在根目录下创建一个software文件夹用来存储下载的压缩包. 2.然后cd跳转的software文件夹下,进行压缩包的下载 wget -c https://nginx.or ...