This is the plnkr of my scenario。当我在chrome中调试此代码时,第二个'if'中的语句不会被执行。但是当我在Firefox中调试它时,第二个'if'中的语句被执行。
angular.module('optionsExample', [])
.controller('ExampleController', ['$scope', function($scope) {
debugger;
if(true){
$scope.name = 'Foo';
}
if(false){
$scope.name = 'lol';
}
}]);
Firefox版本:35.0.1 Chrome版本:41.0.2272.101 m
为什么会这样?
更新
同样在Firefox 36.0.4中测试,同样的问题。
答案 0 :(得分:3)
这可能是一个错误,也可能就是他们设计它的方式。但这似乎与调试器如何处理它可以轻松评估的语句条件以及使用的代码样式(K& R,Allman,1TBS等)
有关。
可以将断点设置为它们的代码行以绿色阴影显示,而不能由调试器以灰色阴影显示的代码行。
简单地说,调试器不会突出显示if语句行(甚至可能是其他控制语句行),它可以很容易地告诉它具有真/假条件。设置断点时,断点将放在下一个可破坏的代码行上。
对于使用1TBS / OTBS或K& R样式格式的块,调试器将突出显示if块中的第一个可断行而不是实际的if语句行。这给出了错误的印象,即如果语句将在下一步执行,则错误条件内的代码。
对于使用Allman样式格式的块,调试器在单步执行时不会突出显示if语句或代码块的任何部分。如果你试图在if语句上设置代码中断,它将跳过整个块并将断点放在下一个可破坏的行上。
当if语句不使用调试器可以读取为真/假的条件时,调试器将按预期运行。
演示测试
debugger;
var one = true;
var two = false;
//Allman Style
if(one)
{
console.log("Truth");
}
if(two)
{
console.log("false");
}
if(true)
{
console.log("Truth");
}
if(false)
{
console.log("false");
}
//1TBS/OTBS Style
if(one){
console.log("Truth");
}
if(two){
console.log("false");
}
if(true){
console.log("Truth");
}
if(false){
console.log("false");
}