var factorial = function factorial (i,a){ a = a ||1; if(i<2){ return a; } return factorial(i-1,a *i);};document.writeln(factorial(3));
解决方案
首先第一次调用factorial函数只传入了一个实参3,所以3是赋值给了i
第一次进入factorial函数:
i是传入来的3,a没有值-->运行完
a=a||1
后,a=1
判断i是否小于2,3不小于2,不执行if里面的代码
返回一个第二次factorial调用,传入两个实参:第一个参数 i-1 :2 第二个参数 i*a :3
第二次进入factorial函数
i是第一个传过来的实参数字2;a是第二个传过来的实参3,这时a有值-->执行a=a||1
后a依然等于3,
同样2不小于2,不符合判断,不执行if里面的代码,
返回第三次factorial函数调用,传入两个实参:第一个参数 i-1 :1 第二个参数 i*a :6
第三次进入factorial函数
i是第一个传过来的实参数字1;a是第二个传过来的实参6,这时a有值-->执行a=a||1
后a依然等于6,
判断,此时i<2成立,返回a,a等于6;
运行结束所以结果是6,没有作用域的问题,只是函数循环调用,这是递归,可以百度一下js递归方面的知识,望采纳