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 运行的函数对象