2011-12-05 31 views
7

Có cách nào để xác định độ sâu ngăn xếp của tất cả các chức năng đang được thực thi trong javascript bằng cách sử dụng chính javascript không?xác định độ sâu ngăn xếp trong javascript bằng cách sử dụng javascript

Tôi nghĩ rằng nó có thể liên quan đến việc sửa đổi nguyên mẫu Function, nhưng tôi thực sự không có bất kỳ ý tưởng nào.

Ngoài ra, thật tuyệt khi có thể ngắt bất cứ khi nào độ sâu ngăn xếp đủ cao.

Lý do cho điều này là tôi có stack overflow error in IE which is apparently not debuggable. Tôi lười biếng và tôi không muốn phải truy tìm mã mà tôi đang cố gắng tìm ra nguyên nhân.

Cảm ơn bạn đã hỗ trợ sự lười biếng của tôi.

+0

Bạn có thể nói một hàm cho một hàm khác và tăng biến toàn cục cho đến khi trình duyệt tự ném lỗi tràn ngăn xếp. Sau đó, bạn in biến số lượt truy cập và bạn có giá trị thô cho chiều sâu ngăn xếp. – Bojangles

Trả lời

5

ECMAscript được hỗ trợ khá lâu trong tài sản Function.prototype.caller. Ngay cả khi nó không được chấp nhận trong ES5 nghiêm ngặt, IE vẫn nên hỗ trợ nó. Vì vậy, bạn về cơ bản có thể lặp theo cách của bạn lên thông qua các chức năng liên quan.

function one() { 
    two(); 
} 

function two() { 
    three(); 
} 

function three() { 
    var caller = three.caller; 

    console.log('caller was: ', caller.name); 

    while(caller = caller.caller) { 
      console.log('caller was: ', caller.name); 
    } 
} 

(function outer() { 
    one(); 
}()); 

Đó sẽ ra:

caller was: two 
caller was: one 
caller was: _outer 

Vì vậy, nếu bạn biết trong đó hoạt động một lỗi xảy ra, như vậy bạn sẽ có được câu trả lời tất cả các con đường lên như thế nào phương pháp này ban đầu được gọi. Nếu bạn chỉ sau chiều sâu, bạn chỉ có thể đếm số lượng giao thoa trên bất động sản caller.caller đã được thực hiện. Ít nhất IE8 nên hỗ trợ câu lệnh "trình gỡ lỗi", mà bạn có thể chỉ cần gọi trong tập lệnh đó để đưa trình gỡ lỗi lên trên sân khấu.

+0

Điều này trông rất giống với những gì tôi đang thực hiện ... nhưng vấn đề là tôi sẽ cần phải bằng cách nào đó áp dụng điều này cho tất cả các chức năng mà không cần phải thêm nó vào mã của họ. Bạn biết ý tôi là gì không? Cảm ơn. – user420667

+1

@ user420667: Tôi không nghĩ rằng có bất kỳ cách "dễ dàng" nào để thực hiện điều đó trên Function.prototype. Bạn về cơ bản sẽ cần phải làm một vòng lặp đệ quy trên tất cả các đối tượng (bắt đầu với 'cửa sổ') và kiểm tra các chức năng. Nếu bạn tìm thấy một, bạn cần phải móc/vá phương pháp và gọi mã được cung cấp ở trên. Có thể làm việc. – jAndy

+0

oh, ok .. vì vậy một cái gì đó giống như cho mỗi chức năng ... newFunction = function() {oldFunction (args); if (CallerDepth()> MaxAllowedDepth) {debugger;}}; oldFunction = newFunction; ??? Tôi không nghĩ điều đó khá đúng. Ngoài ra, như bạn đã nói, hãy đảm bảo rằng bằng cách nào đó được gọi trước bất kỳ hàm nào khác, và cũng đảm bảo rằng danh sách các hàm lặp lại được tạo trước khi sửa đổi bất kỳ hàm nào. – user420667

4
function stackDepth() { 
    var c=stackDepth.caller, depth=0; 
    while (c) { c = c.caller; depth++; } 
    return depth; 
} 

Chrome có vẻ nghĩ rằng độ sâu ngăn xếp từ bảng điều khiển đã là 3, vì vậy có thể cho mỗi môi trường JavaScript bạn cần xác định độ sâu cơ bản ban đầu và trừ đi.

stackDepth(); // => 3 
(function(){return stackDepth();})(); // => 4 
+0

thú vị. Tôi tự hỏi 3 vật thể cấp cao hơn là gì. cửa sổ? tài liệu? – user420667

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