猿问

关于Js函数调用过程的一道题,求大神赐教

function abc(num1){
	   if(num1>3){
		       abc(--num1);
		}
		document.writeln(num1); 
}   
abc(5);

为什么最后输出出来是3 3 4?

而下面这个代码为什么会出错?

function abc(num1){
	   if(num1>3){
		       abc(num1--);
		}
		document.writeln(num1); 
}   
abc(5);

求大神解惑,小白感激不尽

榎目贵音
浏览 1522回答 3
3回答

Nasei

为啥输出 3 3 4:最开始num1的值是5,判断>3成立,--num1的意思是调用前先自减,所以首先自减变成4,然后调用abc(4),同理adc(4)里num1变成3了,然后调用abc(3),abc(3)里直接输出3 ,回到abc(4),输出3,回到abc(5),输出4。下面那段代码语法上在我看来没有错,只不过abc(num1--)这样写的话就变成死循环了,num1--的意思是先调用再自减,这样的话就会一直在调用adc(5),一直循环下去

深山小童

递归:函数里调用函数本身。先一层层的调用函数,直到停止调用,再一层层的返回执行先前未执行完的内容。使用递归一定要有条件来阻止程序死循环。前置递减:--i是语句求值之前i的值先减1,即先执行i= i-1,再(--i)=i;  例如i = 2,那么i = i-1 =1,  (--i) = i = 1。后置递减:i--是语句求值之后i的值才减1,即先执行(i--)=i,再i= i-1;  例如i = 2,那么(i--) = i = 2, i= i-1 = 1。所以第二个例子实际上一直在调用abc(5),无法判断停止调用,陷入死循环,至于会不会报错,额,我也才在学,没试过。

xufeng123456

建议熟悉一下递归函数的原理就会很好理解了;调用第一个函数abc(5)【注意,函数体中"document.write(4)"暂时不会去执行,但是等if()里昨晚就会来执行】;时,就会进入函数体执行abc(4)【同上面的注意,document,write(3)】--->执行abc(3)【这时3不大于3,就不会进入if(),首次执行document.write(3)】---->回到abc(4)中(由于--num),document(3);在回到adb(5),打印4;最终打印3,3,4
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答