2012-02-19 26 views
5

Tôi đang gặp phải một số hành vi kỳ lạ nhất của Javascript.Javascript: false nếu biểu thức tiếp tục thực hiện nếu mã scoped

Mặc dù biểu thức trong câu lệnh if đánh giá là false, mã của tôi bên trong if block vẫn tiếp tục thực thi.

Dưới đây là đoạn mã:

if (view.leftCols !== null) { 
    var leftCols = view.leftCols.split(','); 

    for (var lc = 0; lc < leftCols.length; lc++) { 
     var lcv = leftCols[lc].split(':'); 
     var lcol = lcv[0]; 

     Array.add(allCols, lcol); 

     try { 
      var lwidth = lcv[1] - MyWorkGrid.getColWidth(lcol); 

      if (lcol === 'Edit') { 
       if ($.browser.msie && parseInt($.browser.version) <= 8) { 
        lwidth = 23; 
       } 
      } 

      // this if statement fails. 
      if (lwidth > 0) { 
       grid.SetWidth(lcol, lwidth); 
      } 
     } catch (e) { 
     } 

     grid.MoveCol(lcol, 0, 1, 1); 
    } 
} 

Đây là Firebug ảnh chụp màn hình của tôi:

Firebug

Bất kỳ ý tưởng?

+1

Điều bạn nói xảy ra thực sự không thể xảy ra, vì vậy bạn nên đăng mã. Ảnh chụp màn hình đó là không đọc được. – Pointy

+1

Ảnh chụp màn hình không thể đọc, xin. cung cấp mã và các giá trị hiện tại của các biến được sử dụng trong "if". Oh, và nhân tiện, đó là * luôn luôn * con người trước máy tính, tôi tự tìm ra một lần nữa :) –

+1

chỉ là một giả định, nhưng có lẽ firebug đã lưu trữ một phiên bản cũ của tập lệnh và những gì bạn thấy trong nó khi bạn đang thực hiện từng bước thực hiện không phải là những gì thực sự đang được thực hiện ... –

Trả lời

12

Mặc dù dòng đang được đánh dấu trong Firebug, bạn có chắc chắn là thực sự đang được thực thi? Tôi đã nhìn thấy hành vi này trong Firebug (và các phiên bản đầu của trình gỡ lỗi Chrome), nơi chúng đôi khi sẽ làm nổi bật một dòng mã như thể chúng đã bước vào nó, mà không có dòng thực sự được thực hiện.

Vì vậy, tôi muốn chèn một cái gì đó rõ ràng (như một console.log("lwidth = " + lwidth); vào cơ thể if tuyên bố để xem nếu nó thực sự thực thi. Câu trả lời có thể được Firebug đó chỉ là nêu bật/cho thấy dòng như một hiện tại không đúng mà không cần mã bản thực sự được chạy.

+3

Đúng. Công cụ đó được gọi là FireBUG vì một lý do ... – user123444555621

+0

Bạn chính xác. Nếu tôi đặt điểm ngắt bên trong câu lệnh if. Nó không bao giờ đạt được khi 'lwidth <= 0' ... Chúa giúp Firebug! – Moon

+0

@Moon: Tôi rất vui vì điều đó. Nếu bạn có một trường hợp thử nghiệm đơn giản sao chép vấn đề, có thể đáng giá [báo cáo nó] (http://code.google.com/p/fbug/issues/list). Nếu tôi đã làm như vậy khi tôi nhìn thấy nó một vài năm trước đây (tôi đã không được sử dụng Firebug trong một thời gian), có thể bạn sẽ không có chạy vào nó ngay bây giờ. (Xin lỗi về điều đó.) :-) –

-1

Nó chỉ dòng cuối cùng của khối mã đó đã được nhấn mạnh. Như đã đề cập trong câu trả lời được chấp nhận trên đường nhấn mạnh là không thực sự thực hiện.

1* var a=0;b=0;c=0; 
2* if(false){ 
3>  a++; 
4>  b++; 
5*  c++; 
6> } 
7> 
8* console.log(a+b+c); // will output 0; 

Firebug sẽ bước trên đường dây s 1 và 2 và sau đó sẽ chuyển sang dòng 5 nhưng sẽ không tăng biến a, b hoặc c, tất cả chúng sẽ vẫn ở 0.

(p.s. không thể bình luận .. để đăng câu trả lời với các chi tiết bổ sung cho năm 2013)

+0

Cái gì? !! Tôi không biết tại sao bạn lại nói những gì bạn nói! – Moon

+0

Xin lỗi .. đó là một năm sau đó nhưng tôi đã nghĩ rằng những người khác có thể đã va chạm vào cùng một hành vi FireBug lạ. Tôi đã có .. và câu trả lời được chấp nhận đã giúp tôi nhận ra mã không thực sự được thực hiện .. chỉ cần đánh dấu. Đó là bài đăng đầu tiên của tôi và stackoverflow sẽ không cho phép tôi bình luận vì vậy đó có thể là điều khiến bạn bối rối. – JJones

Các vấn đề liên quan