We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
在try-catch的执行机制里,如果try或者catch中有return,都会先执行finally里的代码,并且finally里没有return才会去执行try或者catch里的return,例如:
try-catch
try
catch
finally
function test1() { try { console.log(1); throw new Error('throw'); } catch (e) { console.log(e.message); return 'from_catch'; } finally { console.log(2); } } console.log(test1()); // 1 'throw' 2 'from_catch' function test2() { try { console.log(1); return 'from_try'; } catch (e) { // TODO } finally { console.log(2); return 'from_finally'; } } console.log(test2()); // 1 2 'from_finally'
这一机制的基础是Javascript语句执行的完成状态,就是Completion Record,它表示一个语句执行完之后的结果,有三个字段:
break
continue
return
throw
normal
JS引擎在遇到Completion Record为normal的时候,就会继续执行下一条语句,如果不为normal,则会打断语句块后续语句的执行。假如我们在语句块中插入了一条return 语句,产生了一个非normal记录,那么整个语句块会成为非normal。这个结构就保证了非normal的完成类型可以穿透复杂的语句嵌套结构,产生控制效果
{ var i = 1; // normal, empty, empty return i; // return, 1, empty i ++; console.log(i); } // return, 1, empty
那么在控制型语句中,if、switch、while/for、try和break、continue、return、throw两两组和产生如下效果:
if
switch
while/for
因为finally中的内容必须保证执行,所以try/catch执行完毕,即使得到的结果是非normal型的完成记录,也必须要执行finally。 而当finally执行也得到了非normal记录,则会使finally中的记录作为整个try结构的结果。
try/catch
EventLoop实现过程:
任务执行优先级:同步任务>微任务>宏任务
setTimeout、setInterval、Promise中的executor
Promise.then
参考:https://www.manman.io/2019/03/21/promise_series/
process.nextTick
setImmediate
DocumentFragment
requestAnimaionFrame
The text was updated successfully, but these errors were encountered:
No branches or pull requests
执行机制
为何try里面放return,finally还会执行,理解其内部机制
在
try-catch
的执行机制里,如果try
或者catch
中有return,都会先执行finally
里的代码,并且finally
里没有return才会去执行try
或者catch
里的return,例如:这一机制的基础是Javascript语句执行的完成状态,就是Completion Record,它表示一个语句执行完之后的结果,有三个字段:
break
continue
return
throw
和normal
几种类型;JS引擎在遇到Completion Record为
normal
的时候,就会继续执行下一条语句,如果不为normal
,则会打断语句块后续语句的执行。假如我们在语句块中插入了一条return
语句,产生了一个非normal
记录,那么整个语句块会成为非normal
。这个结构就保证了非normal
的完成类型可以穿透复杂的语句嵌套结构,产生控制效果那么在控制型语句中,

if
、switch
、while/for
、try
和break
、continue
、return
、throw
两两组和产生如下效果:因为
finally
中的内容必须保证执行,所以try/catch
执行完毕,即使得到的结果是非normal
型的完成记录,也必须要执行finally
。而当
finally
执行也得到了非normal
记录,则会使finally
中的记录作为整个try
结构的结果。JavaScript如何实现异步编程,可以详细描述EventLoop机制
EventLoop实现过程:
任务执行优先级:同步任务>微任务>宏任务
宏任务和微任务分别有哪些
宏任务
setTimeout、setInterval、Promise中的executor
微任务
Promise.then
使用Promise实现串行
参考:https://www.manman.io/2019/03/21/promise_series/
Node与浏览器EventLoop的差异
process.nextTick
和一个宏任务setImmediate
process.nextTick
的执行优先级比Promise.then
高如何在保证页面运行流畅的情况下处理海量数据
DocumentFragment
和requestAnimaionFrame
来减少DOM操作次数和缩短循环时间,如果需要大量的事件绑定,利用事件委托来绑定事件。参考:https://juejin.im/post/5ae17a386fb9a07abc299cddThe text was updated successfully, but these errors were encountered: