Zoeken op website

javascript - Als de 'if'-voorwaarde onwaar is, worden instructies niet uitgevoerd in Chrome, maar wel in Firefox


Dit is de plnkr van mijn scenario. Wanneer ik deze code in Chrome debug, wordt de verklaring in de tweede 'if' niet uitgevoerd. Maar wanneer ik het in Firefox debug, wordt de verklaring in de tweede 'if' uitgevoerd.

angular.module('optionsExample', [])
  .controller('ExampleController', ['$scope', function($scope) {
    debugger;
    if(true){
        $scope.name = 'Foo';
    }
      if(false){
        $scope.name = 'lol';
    }

  }]);

Firefox-versie: 35.0.1 Chrome-versie: 41.0.2272.101 m

Waarom gebeurt het?

Update:

Ook getest in Firefox 36.0.4, hetzelfde probleem.

Antwoord #1

Dit is misschien een bug of het kan gewoon zijn hoe ze het hebben ontworpen. Maar dit lijkt te maken te hebben met hoe de debugger omgaat met if-statementvoorwaarden die hij gemakkelijk kan evalueren, en de gebruikte code-stijl (K&R, Allman, 1TBS, enz.)

Lijnen code waarop breakpoints kunnen worden gezet, worden groen gearceerd, en lijnen waarop dat niet kan, worden door de debugger grijs gearceerd.

Kort gezegd markeert de debugger geen if-verklaringsregels (en misschien zelfs andere controlestatementregels) waarvan hij duidelijk kan zien dat ze een waar/onwaar conditie hebben. Bij het instellen van een breakpoint wordt het breakpoint in plaats daarvan op de volgende onderbreekbare regel code geplaatst.

In het geval van blokken die 1TBS/OTBS- of K&R-stijl opmaak gebruiken, zal de debugger de eerste onderbreekbare regel binnen het if-blok markeren in plaats van de werkelijke if-statementregel. Dit geeft de verkeerde indruk dat de code binnen if-statements met een false conditie als volgende uitgevoerd zal worden.

In het geval van blokken die de Allman-stijl voor opmaak gebruiken, zal de debugger geen enkel deel van de if-instructie of codeblok markeren tijdens het stap voor stap doorlopen. En als je probeert een codeonderbreking op de if-instructie te plaatsen, zal het hele blok worden overgeslagen en zal de breakpoint op de volgende onderbreekbare regel worden geplaatst.

Wanneer de if-verklaringen geen voorwaarden gebruiken die de debugger gemakkelijk als waar/onwaar kan lezen, gedraagt de debugger zich zoals verwacht.

Demo om te testen

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");   
}