这是一个令人讨厌的错误,花了我半个小时来解决。编译器认为这是有效的代码,当它评估语句时,它仍然会调用foo():
if(true && false);{ foo(); }
为什么它有效,为什么foo()仍然被调用?
答案 0 :(得分:22)
好吧,你没有提出问题,但我觉得有必要告诉你为什么编译器是正确的,代码是有效的(对不起,SO的人):
if (true && false);
只是满足条件时执行的空语句(在这种情况下由于&& false
而无法满足它,所以没有任何反应(但无论如何都不会发生))。该语句为空,因为右括号后面紧跟分号。
{ foo(); }
是否在范围块中包含方法调用。 分号终止if条件,因此该块与if条件无关。它本身只是一个块。代码执行,无论是否为条件。
答案 1 :(得分:8)
这是有效的代码。它是一个带有空语句和范围块的if。
实际上我的编译器会对if:可能错误的空语句
发出警告如果你写了:
if (true && false) { foo(); }
它会产生你期望的效果。
但是,如果真正的问题是为什么花了这么长时间才找到问题,那么我可以告诉你问题是你没有阅读编译器生成的警告。
答案 2 :(得分:5)
这是有效的代码,而不是错误。请注意if和大括号之间的额外;
。
您的代码相当于
if (true && false);
//...
{ foo(); }
答案 3 :(得分:2)
删除之间的分号)和{
答案 4 :(得分:2)
if (true && false) {
foo();
}
我认为这就是你想要的。
如果你这样做
if(true && false);
它将停止你的if语句;所以下面的代码都是:
foo();
已执行。
答案 5 :(得分:1)
if(true && false);
;(分号)打破if循环并转到foo();
试
if(true && false)
{ foo(); }
答案 6 :(得分:1)
您可以声称规范是愚蠢的,但您不能声称它是编译器中的错误。我认为将;
直接写为if是非法的,因为我认为没有哪种情况有用。
因为你甚至得到了编译器警告,所以在实践中这不应该是一个大问题。
答案 7 :(得分:-1)
正确答案has already been given,和 这不是一个额外的答案,但无论如何都值得指出:使用jslint你可以避免这个问题。
例如,这是emacs中的一个Javascript缓冲区,其中包含flymake-for-javascript - emacs'即时语法检查程序 - 已启用:
(ps:该图片也使用flymake-cursor.el,以自动显示下面的错误消息)
JSLint可以从命令行运行,可以包含在自动构建过程中,也可以集成到开发工具中。如果您还没有检查过,请执行此操作。你将学习一些Javascript编码的好习惯。