为什么变量重新声明不是JavaScript中的错误?

时间:2013-11-20 17:29:03

标签: javascript

function foo(){
    var bar = 3
    return bar;
    var bar = 8
}
alert(foo());  //prints 3

在C ++中做这样的事情会引发错误。做出这个设计决定的动机是什么?

2 个答案:

答案 0 :(得分:1)

由于JavaScript的功能范围和提升工作原理,该代码基本上被评估为:

function foo() {
  var bar;
  bar = 3;
  return bar;
  bar = 8;
}
alert(foo());

所有变量声明在解析时都会被提升到其作用域的顶部,然后分配在运行时发生,因此,如果您多次声明变量 - 运行时环境不知道,则无关紧要。

答案 1 :(得分:-2)

任何程序基本上都由计算机分三步处理:

  1. 解析,读取源并将其转换为AST。如果无法做到这一点,则会出现语法错误。

  2. 编译,将AST转换为可运行的表示(机器代码,字节码等)。出错时,您会收到编译错误。

  3. 正在运行,可能会遇到一些运行时错误。

  4. “静态”语言(如C ++或Java)旨在在第2步中引发尽可能多的错误。程序员喜欢这样:每个固定的编译器错误意味着以后的调试次数减少。

    像Javascript这样的“脚本”语言通常不会引发任何编译时错误。您获得的每个错误都是语法错误或运行时错误。由于变量声明由编译器处理,而不是在运行时处理,因此仅针对此特定情况添加全新的错误类是没有意义的。