JavaScript的函数自调用

var a=100
			function fn () {
				var b=200
				function  fm () {
					
				}
				console.log(b)
				console.log(fm)
			}
			console.log(a)
			console.log(fn)
			fn()
​
var a=100
			function fn () {
				// console.log(666)
				// console.log(a+10)
				console.log(fn)//打印全局函数fn
				fn()
			}			
			fn()

​

在函数里面继续调用函数本身 就形成了无限的循环

function  fn () {							
				if(x){
					return 100
				}
				else{
						console.log(123)
					fn()
				}			
			}
			fn()

这里只提供一种思路 多次循环if使用自调用

function fn (n) {
			   	if(n<=1){
					return 1
				}
				else{
					return n*fn(n-1)
				}
			}						
			var re=fn(10)
			console.log(re)// 1*...*10			
			// fn(10)==>10*fn(9)==>10*9*fn(8)==>10*9*8*fn(7)==>....10*9...2*fn(1)

利用函数的自调用去实现阶乘

在else语句的代码块中自调用

  
		   
		   function fm (n) {
		   	  if(n>=1000){
				  return 1000
			  }
			  else{
				  return n+fm(n+2)
			  }
		   }
		   var re=fm(128)//128+130+132+134+136.....1000(不能超过1000)
		   var re=fm(31)//31+33+35.....1000(不能超过1000)

同上面例子 不过是一个加法的问题

var arr=[[1,2,3,4,[2,3,4,5],[2,3,4,5],[4,54,2,6]],[2,3,4,4,5,6]]
		   //假设你只知道数组内部全是(数字和数组的混套),不知道嵌套了几层
		   //打印出所有数字		   
		   function fn(arr){
			   // 遍历数组
			   for(var i=0;i<arr.length;i++){
				   if(typeof(arr[i])=="number"){
					   console.log(arr[i])
				   }else{
					  for(var j=0;j< arr[i].length;j++){
						  if(typeof(arr[i][j])=="number") console.log(arr[i])
						  else{
							  //arr[i][j].length  因为不知道嵌套了几层 也就不知道该写几次for循环
						  }
					  }
					  fn(arr[i])
				   }
			   }
		   }		   
		   fn(arr)

这就是我们最常见的遍历器

思路就是:遍历这个数组用if语句去检测数组的第一个元素 是否是基本数据数字还是引用数据数组 如果是数字就输出 否非进入else 在else代码块中继续去用for循环去遍历这个引用数据 在用if去判断是否为基本数据

// fn标识符的问题  因为它是函数定义时的名字  函数体内部可以直接访问
			var obj={say:function fn(n){
				console.log(666)
				if(n<0){
					return 
				}
				// say(n-1)//报错
				fn(n-1)//自己调用自己
			}}
			
			// obj.say(10)
			
			console.log(obj.say.name)

不能用say去调用 fn fn才是函数名

最后打印的也是obj.say.name也是fn 如果我没有给这个函数命名他才会打印say


			(function(n){
				if(n<=1){console.log(1)}
				else{console.log(n);arguments.callee(n-1) }
			})(10)
			// 10 9 8 7 ... 1

涉及到函数的自调用把整个函数小括号阔起来

arguments.callee 运行的函数对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值