javascript 之 第七章第一节(递归)
先举例:
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 之 第七章第一节(递归)的更多相关文章
- Ionic 入门与实战之第二章第一节:Ionic 环境搭建之开发环境配置
		原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第二章第一节,主要对 Ionic 的开发环境配置做了简要的介绍,本文介绍的开发环境为 Mac 系统,Windows 系统基本类似,少许 ... 
- 读《编写可维护的JavaScript》第七章总结
		第七章 事件处理 7.1 典型用法 作者首先给了个我们一个处理事件的方法.看起来也没啥俩样,不过后来给出的优化方法很值得学习: // 不好的写法 function handleClick(even ... 
- c语言第一章第一节  认识变量
		声明:本人大一新生,闲着无聊..写写c语言教程..菜鸟一枚..大神勿喷!!! 接下来我们都用dev来进行编译..vc++太古老了,没提示功能,不好上手,并且老是出毛病..vs太大了,编个c不至于,运行 ... 
- Zabbix简介(第一章第一节)
		Alexei Vladishev创建了Zabbix项目,当前处于活跃开发状态,Zabbix SIA提供支持. Zabbix是一个企业级的.开源的.分布式的监控套件 Zabbix可以监控网络和服务的监控 ... 
- 前端:CSS第四章第一节
		块级元素一行只有一个,比如P标签 CSS层叠样式表,意思就是样式是可以叠加的,比如下面的代码 <style> .ok{ color: aqua; } .blue{ color: #5283 ... 
- tensorflow2.0学习笔记第一章第一节
		一.简单的神经网络实现过程 1.1张量的生成 # 创建一个张量 #tf.constant(张量内容,dtpye=数据类型(可选)) import tensorflow as tf import num ... 
- 第七课第一节,T语言流程语句( 版本5.0)
		流程语句 if语句 用if语句可以构成分支结构.它根据给定的条件进行判断,以决定执行某个分支程序段.TC综合开发工具的if语句有三种基本形式,并且每个语句的结尾都要有一个end (注:关键字,if,e ... 
- 字典 -- 数据结构与算法的javascript描述 第七章
		字典 字典是一种以键-值对形式存储数据的数据结构 最基本功能规划 add 添加数据到字典 remove 从字典中移除数据 get 从字典中取出数据 count 统计字典数据量 find 查找数据在字典 ... 
- JAVAscript学习笔记 js事件 第一节 (原创) 参考js使用表
		<!DOCTYPE html> <html lang="en" onUnload="ud()"> <head> <me ... 
随机推荐
- git 环境搭建
			1. 生成ssh-key 并上传到 git服务器上 #cd $HOME #ssh-keygen -t rsa -C "youremail@example.com" -t 是类型,- ... 
- 发现了一个比较有意思的url参数
			今天登录阿里云发现需要二次验证了,手机号不是我的很麻烦,然后就看到有个手机app快捷登录的方式,点进去一看,链接地址是这样的http://qd.alibaba.com/onekey.htm?spm=0 ... 
- div 拖拽
			html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ... 
- RN如何基于js代码手动打一个main.jsbundle
			react-native bundle --entry-file index.js --bundle-output ./ios/bundle/main.jsbundle --platform ios ... 
- mysql  状态锁 连接数
			show OPEN TABLES where In_use > 0; show status like 'Table%'; SELECT * FROM information_schema.in ... 
- Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'userinfo.
			安装了mysql5.7,用group by 查询时抛出如下异常: Expression # of SELECT list is not in GROUP BY clause and contains ... 
- 3.3.1 MyBatis框架介绍
			MyBatis框架介绍 1. 什么是框架 (1) 框架是偷懒的程序员将代码进行封装, 之后进行重复使用的过程. (2) 框架其实是一个半成品, 以连接数据库为例, 连接数据库使用的驱动, url, 用 ... 
- Python科学计算学习之高级数组(二)
			代码性能和向量化 背景:Python是一种解释型的编程语言,基本的python代码不需要任何中间编译过程来得到机器代码,而是直接执行.而对于C.C++等编译性语言就需要在执行代码前将其编译为机器指令. ... 
- 安利一个vps,7美元/年。
			黑色星期五.给大家安利一个vps,7美元/年.配置如下:2 个虚拟化 CPU 2 GB (2048 MB) 专属内存 50 GB RAID-10 受保护硬盘存储 3000 GB (3TB) 月流量 1 ... 
- 《linux就该这么学》第十七节课:第18,19,23章,mariadb数据库、PXE无人值守安装系统和openldap目录服务。
			第23章 (借鉴请改动) openldap数据的特点:1.短小.2.读取次数较多 上述说明: openLDAP服务端配置: 1.yum install -y openldap openldap ... 
