如何安全地确定是否定义了块范围的变量



如果constlet变量的初始值设定项引发错误,则访问该变量会引发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
}

最新更新