Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么变量重新声明在JavaScript中不是一个错误? 在C++中做这样的事情会出错。做出此设计决策的动机是什么?_Javascript - Fatal编程技术网

为什么变量重新声明在JavaScript中不是一个错误? 在C++中做这样的事情会出错。做出此设计决策的动机是什么?

为什么变量重新声明在JavaScript中不是一个错误? 在C++中做这样的事情会出错。做出此设计决策的动机是什么?,javascript,Javascript,由于JavaScript的功能范围和工作原理,该代码基本上被评估为: function foo(){ var bar = 3 return bar; var bar = 8 } alert(foo()); //prints 3 解析时,所有变量声明都会被提升到其作用域的顶部,然后在运行时发生赋值,因此,如果多次声明变量,本质上无关紧要—运行时环境不知道。任何程序基本上由计算机分三步处理: 解析,其中正在读取源并将其转换为AST。如果不可能,则会出现语法错误 编译、将A

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

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

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

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

  • 解析,其中正在读取源并将其转换为AST。如果不可能,则会出现语法错误

  • 编译、将AST转换为可运行表示(机器代码、字节码等)。出现错误时,会出现编译错误

  • 正在运行,可能会出现一些运行时错误

  • “静态”语言,如C++或java,设计为在步骤2中尽可能地增加错误。程序员喜欢这样:每一个固定的编译器错误都意味着以后更少的调试


    像Javascript这样的“脚本”语言通常根本不会引起任何编译时错误。您得到的每个错误要么是语法错误,要么是运行时错误。由于变量声明是由编译器处理的,而不是在运行时,所以只针对这个特定的情况添加一个新的C++类错误是不合理的。

    -c++标签,因为它不是C++问题。Java或C#中也发生了同样的情况。“做出这个设计决策的动机是什么?”这个问题无法得到有效的回答,除非Brendan Eich,或者有人引用了Brendan Eich解释他为什么这样做的东西(带有有效、可验证的引用)。很明显,行为是有定义的,但不能解释动机。我们都可以投机,但投机不是目的。谁知道为什么?所有的web技术都过于宽容,因为它们必须处理大量糟糕的软件和愚蠢的开发人员。在HTML中也可以有两个s。没有一个浏览器会抱怨。这没有回答问题,即“做出此设计决策背后的动机是什么?”提升是不相关的,没有理由不进行提升,也不允许冗余
    var
    。我想这里引用了两个设计决策。A) (B)事实上,“重新定义”变量并不是语法错误(这是问题中特别提出的)。B背后的推理似乎是A。如果在解析时将声明提升到顶部,则没有理由抛出语法错误。也许。然而,这并不是对这个问题的回答——或者至少,如果是的话,这是推测性的。(事实上,如果这是一个错误,一点悲伤都是可以避免的。)@T.J.Crowder说sirI也可以解释为:函数foo(){var bar;var bar;bar=3;返回条;bar=8;}alert(foo());这只是一个简单的例子,但重点仍然是:变量正在被重新声明。
    function foo() {
      var bar;
      bar = 3;
      return bar;
      bar = 8;
    }
    alert(foo());