javascript - ถ้าเงื่อนไข 'if' เป็นเท็จ คำสั่งจะไม่ถูกดำเนินการใน Chrome แต่จะถูกดำเนินการใน Firefox
นี่คือ plnkr ของสถานการณ์ของฉัน เมื่อฉันดีบักโค้ดนี้ใน 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 เช่นกัน ปัญหาเดียวกัน
คำตอบ #1
นี่อาจจะเป็นบั๊กหรืออาจเป็นเพียงวิธีที่พวกเขาออกแบบมา แต่สิ่งนี้ดูเหมือนว่าจะเกี่ยวข้องกับวิธีที่ตัวดีบักเกอร์จัดการกับเงื่อนไขของคำสั่ง if ที่มันสามารถประเมินได้อย่างง่ายดาย และรูปแบบการจัดโค้ดที่ใช้ (K&R, Allman, 1TBS, ฯลฯ)
บรรทัดของโค้ดที่สามารถตั้งจุดหยุด (breakpoints) ได้จะถูกแสดงเป็นสีเขียว และบรรทัดที่ไม่สามารถตั้งได้จะถูกแสดงเป็นสีเทาโดยดีบักเกอร์
กล่าวอย่างง่าย ๆ ตัวดีบักเกอร์จะไม่เน้นบรรทัดคำสั่ง if (และอาจรวมถึงบรรทัดคำสั่งควบคุมอื่น ๆ) ที่มันสามารถบอกได้อย่างชัดเจนว่ามีเงื่อนไขเป็นจริง/เท็จ เมื่อกำหนดจุดหยุดโปรแกรม จุดหยุดจะถูกวางบนบรรทัดโค้ดถัดไปที่สามารถหยุดได้แทน
ในกรณีของบล็อคที่ใช้การจัดรูปแบบแบบ 1TBS/OTBS หรือสไตล์ K&R ตัวดีบักเกอร์จะแสดงไฮไลต์บรรทัดแรกที่สามารถวางเบรกภายในบล็อค if แทนที่จะเป็นบรรทัดคำสั่ง 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");
}
