2009-06-18 24 views
15

Chúng tôi có một ứng dụng JavaScript rất lớn, sau nhiều tháng mã hóa, chắc chắn sẽ có một số lỗi được định nghĩa mà không sử dụng từ khóa var theo cách sau :Có ngắt Firebug khi biến toàn cầu x được xác định

function() { 
    x = 5; ... 
} 

thay vì:

function() { 
    var x = 5; ... 
} 

này đang xảy ra ở đâu đó - chúng tôi không chắc chắn nơi - và tìm kiếm các tên biến trong câu hỏi khó, vì nó là một từ thông thường xuất hiện 1000s của lần trong sou của chúng tôi rce.

Có cách nào để yêu cầu Firebug phá vỡ dòng đầu tiên tạo ra biến toàn cục nhất định không? Để làm rõ, tôi muốn ngắt chính xác tức thời khi window.x chuyển đổi từ undefined thành giá trị được xác định và để phá vỡ câu lệnh.

Tôi đã thử tạo biểu thức đồng hồ và hy vọng tôi có thể biến nó thành điểm dừng, nhưng dường như tôi không thể tạo biểu thức xem mà không có một số ngữ cảnh hoặc phạm vi nào đó.

Nếu điều này là không thể với Firebug, tôi muốn được quan tâm đến bất cứ điều gì có thể thực hiện điều này trong Firefox nói chung.

Trả lời

12

cung cấp một vài điều

  1. Bạn biết tên của biến
  2. Bạn không có một biến với tên đó trong phạm vi toàn cầu (tuyên bố chức năng bên ngoài), nhưng chỉ trong chức năng.
  3. Có các cuộc gọi đến hàm khai báo biến.

kịch bản này ít sẽ làm các trick:

<script type="text/javascript"> 
window.__defineSetter__("x", function(value) { console.trace(); }); 
x = 1; 
</script> 

Bạn sẽ nhận được một dấu vết của mã thực hiện trước khi chuyển nhượng đó.

Có thể không báo cáo một số trường hợp, vì vậy, hãy xem JSLint. Tải tất cả các tệp JS của bạn ngay tại đó và lint chúng.

+0

Có vấn đề gì với trình định dạng mã không? Tôi không thể làm cho nó hoạt động với ví dụ của tôi. –

+0

vâng bạn phải thêm rất nhiều không gian trước mỗi dòng để định dạng - có cùng vấn đề khi nhập câu hỏi của tôi :) – Maciek

+0

Cách tiếp cận rất hay (hoạt động!) Và cảm ơn bạn đã khám phá \ __ defineSetter \ __ " ma thuật "phương pháp. – Tibo

2

Đây là giải pháp tôi đã kết thúc sử dụng bằng cách thay đổi giải pháp của Ionut G. Stan:

window.__defineSetter__("name", function(value) { 
    if (value=="div") { 
    debugger; 
    } 
}); 

tôi đã sử dụng debugger thay vì console.trace(), vì vậy tôi có thể dừng lại và nhìn vào nó giữa thực hiện. Với console.trace() tôi nhận được một báo cáo dấu vết bazillion do dòng này thực thi nhiều lần.

Phạm vi bị rò rỉ hóa ra được chôn trong Dojo, nơi Dojo đặt biến đó thành tên của phần tử đã xử lý.

+0

Tôi đã sử dụng "trình gỡ rối" ban đầu, nhưng tôi không thể thấy dòng nơi biến được gán, vì vậy tôi nghĩ nó sẽ không giúp bạn. Dù sao, tôi vui vì tôi có thể giúp. –

+0

Điều đó hoạt động tuyệt vời, cảm ơn. –

+0

+1 để cập nhật câu hỏi với những gì phù hợp với bạn. – GuruM

1

Xem trang web của bạn trên các trình duyệt SeaMonkey (tôi sử dụng phiên bản 1.1.16) và nhìn vào lỗi giao diện điều khiển, bạn sẽ thấy một thông báo kiểu này đối với từng nhiệm vụ để một biến chưa được khai báo:

Warning: assignment to undeclared variable x 
Source File: http://....js 
Line: ## 
0

Ngoài việc gỡ lỗi, tôi khuyên bạn nên kiểm tra mã của mình bằng JSLint, báo cáo các bài tập không mong muốn trong phạm vi toàn cục là lỗi.

Có một số gói dòng lệnh của jslint, chẳng hạn như jslint4java có thể được sử dụng nền tảng chéo trong Ant build scripts.

2

Đây là một giải pháp khác chỉ hoạt động trong Firefox vì nó sử dụng phương pháp watch dành riêng cho Firefox.

Đặt mảnh này javascript ở phía trên cùng của trang html của bạn, ngay sau thẻ <head>:

<script> 
window.watch('x', function() { debugger }); 
</script> 

Lưu ý rằng watch công trình trên bất kỳ đối tượng Javascript (window là đối tượng javascript toàn cầu).

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