function foo(){
var bar = 3
return bar;
var bar = 8
}
alert(foo()); //prints 3
在C ++中做这样的事情会引发错误。做出这个设计决定的动机是什么?
答案 0 :(得分:1)
由于JavaScript的功能范围和提升工作原理,该代码基本上被评估为:
function foo() {
var bar;
bar = 3;
return bar;
bar = 8;
}
alert(foo());
所有变量声明在解析时都会被提升到其作用域的顶部,然后分配在运行时发生,因此,如果您多次声明变量 - 运行时环境不知道,则无关紧要。
答案 1 :(得分:-2)
任何程序基本上都由计算机分三步处理:
解析,读取源并将其转换为AST。如果无法做到这一点,则会出现语法错误。
编译,将AST转换为可运行的表示(机器代码,字节码等)。出错时,您会收到编译错误。
正在运行,可能会遇到一些运行时错误。
“静态”语言(如C ++或Java)旨在在第2步中引发尽可能多的错误。程序员喜欢这样:每个固定的编译器错误意味着以后的调试次数减少。
像Javascript这样的“脚本”语言通常不会引发任何编译时错误。您获得的每个错误都是语法错误或运行时错误。由于变量声明由编译器处理,而不是在运行时处理,因此仅针对此特定情况添加全新的错误类是没有意义的。