如果const
或let
变量的初始值设定项引发错误,则访问该变量会引发ReferenceError
-,即使通过typeof
检查其类型也是如此。
// Foo.js
class Foo { constructor() { /* Something goes wrong and throws... */ } }
const gFoo = new Foo(); // Throws an error
// Elsewhere...
console.log(typeof gFoo); // throws ReferenceError: foo is not defined
是否有其他方法可以测试gFoo
是否已成功初始化,或者是否必须在try
/catch
块中封装typeof
检查?
let isInitialized = false;
try {
if (typeof foo != 'undefined')
isInitialized = true;
} catch (e) {} // ugly but it works
主要是,我对typeof
能够抛出ReferenceError感到惊讶。
当抛出错误时,当前函数的执行将停止(抛出后的语句将不会执行(,控制权将传递给调用堆栈中的第一个catch块。此时,变量没有初始化,导致ReferenceError异常。
因此,为了回答您的问题,每当您知道可能出现错误时,请确保始终将其封装在try-catch块中。
在上面的例子中,由于错误可能发生在分配给foo的函数中,因此应该在那里有try-catch块;类似于:
const foo = (() => {
try {
// Do whatever
throw Error();
// return value to assign to foo
} catch(err) {
// Log error for monitoring
// return undefined
}
})();
if (foo) {
// Do something with foo
} else {
// Do something if foo errored
}