多半是对的。除了两个主要的例外(撇开明显的“定义一个函数,调用函数”,它有效地“回到”函数体):
1:吊装。var
声明被提升,所以如果你写
alert(a);
var a = 123;
您得到undefined
,而不是错误消息。这是因为它被吊到
var a;
alert(a);
a = 123;
同样,函数定义也被提升。如果你写:
foo(123);
function foo(num) {alert(num);}
它将起作用,因为该功能已被提升。但是,如果你写了这不起作用
foo(123);
foo = function(num) {alert(num);}
因为那是匿名函数的赋值,而不是函数定义。
2:异步函数。
初学者的一个常见错误是这样写:
var a = new XMLHttpRequest();
a.open("GET","sompage.php",true);
a.onreadystatechange = function() {
if( a.readyState == 4 && a.status == 200) {
myvar = "Done!";
}
};
a.send();
alert(myvar);
他们希望警报说Done!
,但相反,他们得到一个关于它未定义的莫名其妙的错误。这是因为myvar = "Done!"
尚未运行,尽管它出现在脚本的较早部分。
另请参阅Computer Stupidities的这个轶事:
一位编程入门的学生曾经让我看一下他的程序,并弄清楚为什么它总是因为简单的计算而产生零。我看了看程序,很明显:
begin
readln("Number of Apples", apples);
readln("Number of Carrots", carrots);
readln("Price for 1 Apple", a_price);
readln("Price for 1 Carrot", c_price);
writeln("Total for Apples", a_total);
writeln("Total for Carrots", c_total);
writeln("Total", total);
total := a_total + c_total;
a_total := apples * a_price;
c_total := carrots + c_price;
end;
- 我:“嗯,你的程序不能在计算之前打印出正确的结果。”
- 他:“嗯?正确的解决方案是合乎逻辑的,计算机应该以正确的方式重新排列指令。”