看代码,下面是一个递归函数:
function foo(i){
if(i==4){
return;
}
console.log("fb:" + i);
foo(i + 1);
console.log("fe:" + i);
}
foo(1);
在我还没有执行这段代码前,我想当然的打印输出顺序是:
打印输出:
fb:1
fe:1
fb:2
fe:2
fb:3
fe:3
然后,我执行之后是这样的:
打印输出:
fb:1
fb:2
fb:3
fe:3
fe:2
fe:1
Oh,我的天哪。。。其实仔细想一下就会明白,这是很基础的吧。下面是我对应此段代码写的伪代码:
// 伪代码:
foo(1);//一开始传了一个1进来
function foo(i){
if(i==4){
return;
}
console.log("fb:" + i);//第一行输出---fb:1
//此时执行:foo(i + 1);
function foo(i){//i = i + 1 = 2
if(i==4){
return;
}
console.log("fb:" + i);//第二行输出---fb:2
function foo(i){//i = i + 1 = 3
if(i==4){
return;
}
console.log("fb:" + i);//第三行输出---fb:3
console.log("fe:" + i);//第四行输出---fe:3
}
console.log("fe:" + i);//第五行输出---fe:2
}
//所以后面的console.log("fe:" + i);被推到嵌套函数foo(i + 1)的后面了
console.log("fe:" + i);第六行输出---fe:1
}
总结:始终记住js是 “解释执行”的这个特点,执行是从上到下的。在没有异步的情况下,js代码是不能跳过前面的代码 去执行后面的代码的。