@
linxiaoziruo #13
@
Sevenskey #15
猜测是不是这样
执行代码
function bomb()
{
try {
return bomb()
} catch(err) {
return apiX()
}
}
console.log( bomb() )
爆栈阶段调用过程
bomb_2 (){
try {
bomb_1 (){
try {
return bomb_0() ...
} catch(err) {
return apiX_0() ...
}
}
} catch(err) {
apiX_1 (){
try {
return internal() ...
} catch(err) {
return key
}
}
}
}
实际流程
=> bomb_0(申请资源出错) => apiX_0(申请资源出错)
=> bomb_1(抛出错误) => apiX_1(正常执行)
=> internal(申请不到资源) => return key
本题可解的关键是 return key 分支比 return internal() 少一级函数调用,如果两者调用长度相等,那么就失败了
简单添加一句代码给 return key 分支加长调用链,令 apiX 为
apiX = function(x) {
try {
return internal(x)
} catch(err) {
(function(){})() // 此句新加
return key
}
}
此时用上面方法爆栈是无法获取 key 的