【发布时间】:2018-07-18 18:33:50
【问题描述】:
如果您对问题的详细信息不感兴趣,请直接跳至TL/DR
简短的序言:
我最近决定从头开始全面重新学习 JavaScript。 这一次不仅是它是如何工作的,而且是它为什么起作用。一旦您还了解了编译器的工作原理以及所有其他细节,一切都会变得更有意义,问题是有一个预先构建的小表达式:
当它似乎违反了 JS 已有的所有词法和范围规则时,我无法完全理解它为什么起作用。
我没有得到的东西:
不应该打破范围吗?
在这里,我们只使用 2 个级别的范围。try{ } 内的作用域catch{ } 内的作用域和global 作用域。如果我们要说明这一点,它看起来像这样:
现在两个内部作用域应该充当两个单独的作用域,并且不会相互冲突。考虑到这一点,**try {} 的值怎么会返回到 catch {} 块中,而它应该作为范围包含在自身中。
我什至尝试使用"use strict"; 来查看是否可以以某种方式捕获尝试在块范围之外传递参数的异常,但即便如此.. nada 仍按预期工作:
从技术上讲,我在这里使用
function()创建了一个额外的范围, 不幸的是,没有在 jsfiddle 中使用严格模式是不可能的 自调用函数
(function(){
"use strict";
try {
throw 'MadeUpError';
}
catch(e) {
console.log(e);
}
})();
为什么try {} 块能够将参数传递给catch {} 块,尽管它与strict mode 冲突?
似乎很不合逻辑,当标识符(e) 应该只对它自己的范围是唯一的。
此外,我什至无法从词汇上理解它。
catch 块调用对抛出的异常的不存在索引 (?) 进行右侧查找。
它从哪里以及如何知道它应该从哪里检索异常?
TL/DR:
可能回答这个问题最简单的方法是用编译器的伪语言来回答它:例如。
/*
1. I arrived at try { } block
2. Created a new Exception
3. I stored Exception at (?)
4. Exited try { }
5. I looked up Exception from ...
*/
希望你能收到我冗长的帖子。我知道这更多是一个理论问题,但我想充分了解try..catch 操作期间幕后发生的事情。
【问题讨论】:
标签: javascript error-handling try-catch