一:首先了解函数的执行
函数调用时会在内存中形成一个调用记录又称“调用栈”,用来保存函数的执行位置变量等信息,并开辟一块新的执行环境,函数执行完毕销毁执行环境并出栈。
二:递归函数
递归函数执行时,函数的每一次调用都会依次进入调用栈,按照后进先出的原则依次出栈。
/**
* 函数递归执行顺序
* 一:首先了解函数的执行。函数每次调用都会进栈开辟一块新的执行环境,函数执行完毕销毁执行环境出栈。
* 二:递归函数:递归函数执行时会形成闭包,函数执行环境会被保存到内存中,递归函数会根据函数的执行次数依次出栈,按照后进先出的原则出栈。
*
* 函数调用时会在内存中形成一个调用记录又称“调用栈”,用来保存函数的执行位置变量等信息,并开辟一块新的执行环境,函数执行完毕销毁执行环境并出栈。
* 递归函数执行时,函数的每一次调用都会依次进入调用栈,按照后进先出的原则依次出栈。
*
* */
function setEmpty (val) {
debugger
if (val.constructor !== Object) return;
const obj = JSON.parse(JSON.stringify(val));
for (let item in obj) {
if (
obj[item].constructor === String ||
obj[item].constructor === Number ||
obj[item].constructor === Boolean
) {
obj[item] = "";
}
if (obj[item].constructor === Array) {
obj[item] = [];
}
if (obj[item].constructor === Object) {
obj[item] = setEmpty(obj[item]); // 接收函数返回的结构
/**
* 如果在此处是 return setEmpty(obj[item]); 不保留上一次调用帧,那么会阻断函数出栈,只返回最后一次进栈的结果。
* */
}
}
return obj; // 返回每次调用的结果,return 就是出栈,如果不写 return 默认返回 undefined。
}