如果require失败,则为const行为

时间:2016-09-28 00:47:50

标签: javascript ecmascript-6

打开节点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对象。

3 个答案:

答案 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声明失败仍然在范围内,因此节点拒绝重新声明它。