2011-10-19 47 views
52

Tôi đang gặp phải một số vấn đề tràn ngăn xếp Javascript phía máy khách cụ thể trong trình duyệt IE, điều này xảy ra bên trong thư viện của bên thứ ba thực hiện một số cuộc gọi chức năng và vì lý do nào đó đó là giới hạn ngăn xếp thấp.Giới hạn kích thước ngăn xếp Javascript của trình duyệt

Sau đó, tôi đã mã hóa một HTML thử nghiệm nhỏ để kiểm tra giới hạn kích thước ngăn xếp đối với một số trình duyệt và thấy rằng IE8 thực sự là một giới hạn ngăn xếp nhỏ nếu so với FF 7 hoặc Chrome 14 chạy trên Máy tính xách tay có hệ điều hành Windows 7, RAM 8Gb:

<html> 
<body> 

<!-- begin Script: --> 
<script type="text/javascript"> 

function doSomething(){ 

    var i = 3200; 
    doSomethingElse(i); 

} 

function doSomethingElse(i){ 
    if (i == 0) return -1; 
    doSomethingElse(i-1); 
} 

doSomething(); 

</script> 
<!-- END OF PAGE --> 

</body> 
</html> 

IE tăng tràn bộ nhớ khi giá trị khoảng 3200, Firefox và Chrome có thể xử lý đệ quy rất sâu nếu so sánh với IE.

Tôi muốn biết nếu có cách nào để buộc ngoại lệ tràn ngăn xếp với hàm Javascript đã tăng nó trong khi chạy trong IE hoặc bất kỳ trình duyệt nào khác và nếu nó có thể cung cấp cho stacktrace chuỗi chức năng trong ngăn xếp tại thời điểm lỗi được nêu ra.

+0

Đó có phải là câu hỏi không? – BNL

+2

3200 cuộc gọi là rất nhiều không gian ngăn xếp. Các lập trình viên Python (tốt, những người không bẻ cong viết các trình phân tích cú pháp gốc đệ quy hoặc thay thế các vòng hoàn toàn đơn giản với đệ quy cho nó) nhận được cùng với giới hạn cuộc gọi 1000. Bạn đang làm gì đấy? – delnan

+3

Nó không được nói một cách khéo léo trong một chế độ thẩm vấn, nhưng câu cuối cùng "Tôi tự hỏi nếu có ..." có thể được bắt đầu với "Có" và kết thúc bằng một dấu chấm hỏi, mang lại một câu hỏi khá trực tiếp. – jball

Trả lời

91

Sử dụng a simple test:

var i=0; 
function inc() { 
    i++; 
    inc(); 
} 
inc(); 

Internet Explorer

  • IE6: 1130
  • IE7: 2553
  • IE8: 1475
  • IE9: 20678
  • IE10: 20.677

Mozilla Firefox

  • 3,6: 3000
  • 4,0: 9015
  • 5,0: 9015
  • 6,0: 9015
  • 7.0: 65533
  • 8B3: 63485
  • 17: 50762
  • 18: 52596
  • 19: 52458
  • 42: 281810

Google Chrome

  • 14: 26.177
  • 15: 26168
  • 16: 26166
  • 25: 25090
  • 47: 20878
  • 51: 41753

Safari

  • 4: 52426
  • 5: 65534
  • 9: 63444

Opera

  • 10,10: 9999
  • 10,62: 32.631
  • 11: 32.631
  • 12: 32631

Đối với câu hỏi của bạn, sử dụng nhà phát triển của trình duyệt của bạn công cụ để xem ngăn xếp. Trong IE 8+, nhấn F12, chuyển đến tab Tập lệnh và nhấp vào Bắt đầu gỡ lỗi. Nó sẽ phá vỡ khi một ngoại lệ được ném ra, và bạn có thể thấy ngăn xếp cuộc gọi. Bạn cũng có thể sử dụng các công cụ dành cho nhà phát triển của Chrome, Ctrl + Shift + J.

+6

Bạn cũng có thể sử dụng F12 cho Chrome quá –

+1

Với bài kiểm tra http://jsfiddle.net/9YMDF/show/ Tôi đã có ~ 21000 cho Chrome 28, 26000..53000 cho Firefox 20+, và ~ 3000 cho IE10 trên Windows 7 SP1 64 bit. Opera 12.X có độ sâu ngăn xếp khá gần 32768. Và tôi đã tìm thấy một cài đặt IE8 không may với độ sâu ngăn xếp bằng 276! – Victor

+0

Bạn có thể so sánh các kết quả này với [BrowserScope được liên kết tại đây] (http://stackoverflow.com/questions/2805172/what-are-the-js-recursion-limits-for-firefox-chrome-safari-ie-etc) –

5

Đây là trình duyệt cụ thể, không chỉ kích thước ngăn xếp, mà còn tối ưu hóa, những thứ như tối ưu hóa đệ quy đuôi và nội dung. Tôi đoán điều đáng tin cậy duy nhất ở đây là viết mã theo cách không đưa hàng tấn vào ngăn xếp hoặc kiểm tra thủ công (đọc sâu vào tài liệu hướng dẫn) từng trình duyệt. Sau khi tất cả, khi bạn nhìn thấy lỗi "quá nhiều đệ quy" hoặc tương tự như bạn đã biết có điều gì đó thực sự sai với mã của bạn.

+0

là TCO có thực sự thực hiện trong JavaScript không? Tôi đọc ES6 có thể nhận được hỗ trợ nhưng tôi không nghĩ rằng nó đã được thực hiện được nêu ra. –

+0

TCO đứng sau một lá cờ trong chrome ngay bây giờ (hai triển khai khác nhau đang được đánh giá). Tôi không biết bất kỳ trình duyệt nào được cài đặt theo mặc định. –

+1

@JanusTroelsen: ES2015 ("ES6") thực sự yêu cầu động cơ để thực hiện TCO. V8 có nó, nhưng nhóm V8 không xem xét nó "ổn định" nhưng vì vậy bạn phải kích hoạt nó. (V8 phân loại các tính năng mà họ đã bắt đầu ở tất cả là "vận chuyển" [thực hiện], "ổn định" và "đang tiến hành". TCO vẫn đang "tiến hành" nhưng những điều cơ bản là có cho cả ba máy tạo mã của V8. chưa quảng cáo nó thành "ổn định" nhưng chúng vẫn đang tối ưu hóa/sửa lỗi/sửa lỗi. Thêm tại đây: http: // stackoverflow.com/a/30369729/157247) –

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