Javascript中的try-catch语句捕获了哪些类型的错误?

Javascript中的try-catch语句捕获了哪些类型的错误?,javascript,Javascript,如果我写 try { null = foobar } catch(e) { alert( e ) }; 没有任何警报,但控制台中记录了ReferenceError。但是, try { barfoo = foobar } catch(e) { alert( e ) }; 显示带有参考错误的警报 所以问题是:try-catch语句在什么上下文中捕获了什么类型的错误?因此,您的第一行代码是无效的JavaScript语法。这就是为什么你会得到一个: ReferenceError:赋值中的左侧无效(不

如果我写

try { null = foobar } catch(e) { alert( e ) };
没有任何警报,但控制台中记录了
ReferenceError
。但是,

try { barfoo = foobar } catch(e) { alert( e ) };
显示带有
参考错误的警报


所以问题是:try-catch语句在什么上下文中捕获了什么类型的错误?

因此,您的第一行代码是无效的JavaScript语法。这就是为什么你会得到一个:
ReferenceError:赋值中的左侧无效
(不能将变量赋值给
null

第二行是有效语法,但抛出一个:
引用错误:未定义foobar

现在,第二行确实被捕获,但第一行没有被捕获,是因为JavaScript解释器在解释代码时抛出了第一个错误,而在第二个示例中,它实际执行代码时抛出了第一个错误

更简单的解释,由以下人员提供:

与运行时错误相比,它只是无效的JavaScript语法。后者被抓住了,前者没有

您可以把它看作是JavaScript解释器,在执行之前查看所有代码,然后思考是否所有代码都正确解析?如果没有,它将抛出一个不可跟踪的
错误
(可以是
语法错误
引用错误
)。否则,代码将无法执行,并且在执行期间的某一点上,您将进入try/catch块,并捕获其中抛出的任何运行时错误


(呃,我该如何恰当地表达这个…)我不知道。第一个应该由适当的IDE捕获,因为它是无效的JavaScript语法。啊,运行时错误,这就是我要找的!介意我在回答中引用你的话吗?嗯,似乎真的发生了什么。分配之前的代码也不会执行。这仍然相当令人困惑。我本以为会抛出错误。@Matt:我想最好在“静态语义:早期错误[…]-如果LeftHandSideExpression既不是ObjectLiteral也不是ArrayTerral,并且LeftHandSideExpression的IsValidSimpleAssignmentTarget为false,则这是早期引用错误。”关于
IsValidSimpleAssignmentTarget
:早期错误(即解析时间错误)和运行时错误的一个有用说明:添加一个前导
警报(1)
到您的
try
块(即
尝试{alert(1);…}
)。您将看到它仅在第二种情况下运行。在第一种情况下,不会生成警报,因为代码从未运行(因为解析失败)。如果由于解析错误而没有任何代码运行,
catch
块将无法运行。