2016-09-28 70 views
1

打开节点REPL(V6.6.0)和做:const的行为失败

> 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对象。

回答

1

我想问题是,这是预期的行为?

是的。常量不能重新定义重新声明。 const test宣布它,但未能定义它,因为发生错误。

我原以为const变量至少会包含Error对象。

require不会返回错误,它会抛出一个错误。如果你想要它,你需要catch它。

1

是的,这是预期的行为。如果抛出异常,test变量将永远不会初始化。这也是像

var getTest; 

try { 
    getTest = function(){ 
     return test; 
    }; 

    throw new Error(); 

    const test = 'a string'; 
} catch (e){ 
    // ignore the error 
} 

getTest(); 

的东西的情况下访问test,这是从来没有初始化,因为异常导致不能分配的字符串值getTest最后的通话将尝试。它永远不会被分配Error对象,因为test的初始化与异常无关。

0

我不知道这是否是一个错误,但无论它是否有意或无意,此行为只能发生在REPL环境中。

的原因是,不像varconst -scoped,但如果你尝试分配抛出异常给它(例如,当模块解析失败),异常的需要语句的结果将被抛出并执行将离开块的范围,所以变量超出范围。由于抛出异常后定义的变量不能保持在同一范围内,因此不能在同一范围内重新定义新的const变量。

然而,在REPL环境,你离开相同范围当异常发生故障,因此,你可以的情况下失败的常量声明仍然在范围结束,所以节点拒绝重新声明它。

相关问题