这里的代码是我实际所做的极其简化的版本,所以请不要试图在此搜索任何深层含义。我定义了这样的自定义错误。
function CustomError(message) {
this.message = message;
this.stack = (new Error()).stack;
}
CustomError.prototype = Object.create(Error.prototype);
接下来,我创建一个只有一个目的的简单函数,即抛出此错误。
function foo() {
throw new CustomError('custom error message');
}
现在我创建一个下一个将进入无限循环的函数,检查是否有任何错误,一旦发现任何错误(除了自定义错误)之外就会中断(好吧,它应该但不会)。
function bar() {
for (;;) {
try {
console.lg(foo());
} catch (error) {
if (error instanceof CustomError) {
console.log(error);
} else {
throw new Error(error);
}
}
}
}
bar();
console.lg(foo());
的拼写中存在故意错误,该错误应该抛出不是CustomError
实例的错误,从而导致达到导致崩溃的throw new Error(error);
行该计划。
相反,执行foo()
内的console.lg(foo());
函数并抛出CustomError
,循环将永远持续。
我有可能在这里犯了一个愚蠢的错误,但我不知道在哪里。所以我的问题是:
为什么console.lg();
的内部在没有破坏程序的情况下到达,当它显然不是有效的代码?为什么在“非有效方法”错误之前抛出CustomError
?
答案 0 :(得分:0)
使用解释器,在使用所述参数调用(尝试)调用其外部函数之前评估参数。在首先解析其参数的函数调用值之前,它不会查看外部函数调用的有效性。
答案 1 :(得分:0)
函数调用的工作方式as specified。 console.lg
将评估为undefined
。但是然后在之前评估参数,检查被调用的值是否实际上是一个可调用的函数。如果对参数的评估已经抛出异常(就像你的foo()
那样),那么这个步骤甚至都不会发生。