打开节点repl(v6.6.0)并执行:
> const test = require('somethingGuaranteedToFail');
Error: Cannot find module 'somethingGuaranteedToFail'
现在变量test
既不能重新定义,也不能正确初始化。
> console.log(typeof test);
ReferenceError: test is not defined
> const test = 1;
TypeError: Identifier 'test' has already been declared
在分配期间抛出错误的任何事情似乎都会发生,而不仅仅是要求。
我想问题是,这是预期的行为吗?我原以为const变量至少包含Error
对象。
答案 0 :(得分:1)
我想问题是,这是预期的行为吗?
是。 const不能重新定义或重新声明。 const test
声明了它,但未能定义它,因为引发了错误。
我原以为const变量至少包含
Error
对象。
require
不会返回错误,它会抛出一个错误。如果需要,您需要catch
。
答案 1 :(得分:1)
是的,这是预期的行为。如果抛出异常,test
变量将永远不会初始化。像
var getTest;
try {
getTest = function(){
return test;
};
throw new Error();
const test = 'a string';
} catch (e){
// ignore the error
}
getTest();
对getTest
的最终调用将尝试访问从未初始化的test
,因为该异常导致永远不会分配字符串值。永远不会为它分配Error对象,因为test
的初始化与异常无关。
答案 2 :(得分:0)
我不知道这是否是一个错误,但无论是否有意,这种行为只能在REPL环境中发生。
原因是,与var
不同,const
是 block -scoped,但是如果您尝试分配一个会向其抛出异常的require语句的结果(例如,当模块解析失败时),将抛出异常并且执行将离开块的范围,因此变量超出范围。由于在抛出异常后无法保持与定义变量相同的范围,因此无法在同一范围内重新定义新的const变量。
但是,在REPL环境中,当异常失败时,不会保留相同的范围,因此 最终可能会导致const声明失败仍然在范围内,因此节点拒绝重新声明它。