-
Notifications
You must be signed in to change notification settings - Fork 834
New issue
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
第一题:以下代码输出什么,为什么? #1
Comments
Fucking Awesome ! - VM404:2 Uncaught (in promise) ReferenceError: a is not defined
|
a is not defined |
|
ReferenceError: a is not defined |
a is not defined |
1 similar comment
a is not defined |
async 约等于 Promise |
执行try中语句时报错 |
ReferenceError: a is not defined |
try {
await (async function() { a().b().c() })()
} catch (e) {
console.log(`执行出错:${e.message}`)
} 就可以catch啦 |
执行a()时,因为a未定义,所以会报错 |
a is not defined |
ReferenceError: a is not defined async定义的是异步任务,catch无法捕获 |
如果有异步函数的话,就不需要用try catch 了 |
ReferenceError: a is not defined; |
what‘s the fuck you doing here? |
至于为啥catch 没有捕捉到,楼上很多的人都没有解释很清楚,我来回答一下我的陋见: |
try catch 不能捕获异步代码。 所以也不是单纯的考量promise吧。虽然他也属于异步 |
1.try catch捕获不到该错误 |
1.try里面是一个自执行的async函数,async是异步的方法,try catch没办法捕获到异步方法 |
个人见解: try catch是同步的,而async是异步的,返回的是一个Promise。而try catch只能捕获到同步函数中的异常,无法捕获到异步函数中的异常错误。而async中执行的,a().b().c(),一开始的a就会报错,因为a未定义。报错为:Uncaught ReferenceError: a is not defined |
我又要来提灵魂之问了?为啥try catch 不能捕获异步任务的error ,这跟浏览器的执行机制(事件循环)有关: |
给出2个例子 方便理解 // 异步,宏任务
try {
setTimeout(function() {
console.log(b);
}, 0);
} catch (error) {
console.log('error', error); // 这里是不会执行的
}
console.log('out try catch')
// 异步,微任务
try {
new Promise(() => {
throw new Error('new promise throw error');
});
} catch (error) {
console.log('error', error);
} 原因是因为:当异步函数抛出异常时,对于宏任务而言,执行函数时已经将该函数推入栈,此时并不在 try-catch 所在的栈,所以 try-catch 并不能捕获到错误。对于微任务而言,比如 promise,promise 的构造函数的异常只能被自带的 reject 也就是.catch 函数捕获到。 |
try {
let a = 0
;(async function() {
a += 1
console.log('inner', a)
throw new Error('123')
// a()
})()
console.log('outer', a)
} catch(e) {
console.warn('Error', e)
} 这段代码,inner 会在 outer 之前输出,为啥? |
ReferenceError: a is not defined |
promise是异步。 throw new Error('123')的时候错误被promise.reject接收,然后继续执行同步代码,等同步代码执行完执行异步爆出这个错误 |
本人补充一下,为啥要等 outer 输出完后,再抛错 |
老哥,你是第一位给出完整答案的,如果需要简历修改服务可以发我邮箱:zx597813039@gmail.com |
ReferenceError: a is not defined
|
答案已经公布,地址 |
感觉上述的答案并不对。 |
我感觉你说的才是正确的,我昨天也是第一次知道Promise中的错误不会被抛到外部了。然后搜索一圈,就找到这么一篇文章翻译自V8引擎作者的文章 从JS引擎理解Await b()与Promise.then(b)的堆栈处理 。虽然不是和本次题目强关联,但也是在Promise与堆栈方面带给我所不知道的一面 try {
let a = 0
;(async function() {
a += 1
console.log('inner', a)
throw new Error('123')
// a()
})()
console.log('outer', a)
} catch(e) {
console.warn('Error', e)
} 如上代码,他是能够输出'outer' 1 的 ; try catch认为你这段代码没有错,所以进不了catch。Promise内部的错误应该在Promise中解决。 ;(function(){
let p
try {
let a = 0
p=Promise.resolve(1).then(e=>a())
console.log('outer', a)
} catch(e) {
console.warn('Error', e)
}
setTimeout(()=>{
p.catch(e=>{console.warn(e)})
},1000)
})() 然后我有这么一段代码,我惊奇的发现chrome控制台会在1s后把错误输出给吞回去;输出warnning。 |
这种问题其实其实查标准就好了: 内部 throw 被 |
如上图,从 ECMA-262 的
至于第二个问题,众所周知当 Promise 异常未被捕获时,会报 |
@ambit-tsai @KieSun 感谢二位, execution context stack 我还得再研究研究 ! |
try{ 1 首先 try catch (同步)异常 报错 会执行 catch |
a is not defined |
|
游览器会抛出异常 a is not defined |
|
个人觉得这道题考察的是 async 函数执行出错时语言层面是怎么处理的,而不是异步导致 try catch 无法捕获错误。(async function() { a().b().c() })() 并没有涉及到异步。 @ambit-tsai 的解释比较靠谱 |
|
第一反应答案是什么?为什么会这样报错?
答案
新建了一个大厂真题每日打卡群,有意愿学习打卡的再进,群已达扫码上线,请加好友拉你进群。
The text was updated successfully, but these errors were encountered: