8

javascript, khi chạy qua JSLint hét lên với tôi và tôi không chắc chắn lý do.JSLint phàn nàn về việc thử/bắt của tôi

/*jslint browser: true, devel: true, evil: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, newcap: true, immed: true */ 

var foo = function() { 
    try { 
    console.log('foo'); 
    } catch(e) { 
    alert(e); 
    } 

    try { 
    console.log('bar'); 
    } catch(e) { 
    alert(e); 
    } 
}; 

foo(); 

Nó nói với tôi:

Vấn đề ở dòng 12 kí tự 11: 'e' đã được xác định.

} catch(e) {

Nó dường như là khó chịu mà tôi có một giây catch(e). Tại sao đây lại là một vấn đề? Liệu nó không chỉ đơn giản là đặt e để biến địa phương bên trong khối catch? Tôi có cần phải đặt tên duy nhất các biến cục bộ cho tất cả các lỗi bị mắc kẹt trong một hàm không?

Trả lời

9

Để JSLint, try..catch có tác dụng tiềm ẩn khi khai báo e làm biến cục bộ. Bởi vì bạn có hai khối như vậy trong cùng một hàm (không có phạm vi khối trong JavaScript), JSLint thấy rằng khi khai báo một biến đã được khai báo là.

Đặt tên cho các biến e1, e2, vv sẽ ngăn cảnh báo này khỏi JSLint. Nó thực sự là một vấn đề? Đặc tả ECMAScript 5, phần 12.14, cho biết "Không có vấn đề làm thế nào kiểm soát lá Block LexicalEnvironment luôn luôn được khôi phục lại trạng thái trước đây của nó." Này, trên thực tế, không có vẻ như là trường hợp:

try { 
    throw new Error("testing 1234"); 
} catch(fooBarBaz){ 
    alert("Catch: " + fooBarBaz); // works 
} 

alert(fooBarBaz); // throws exception 

Vì vậy, để kết luận, điều này chỉ đơn giản là một hạn chế của JSLint và khó có khả năng dẫn đến bất kỳ vấn đề thực tế.

+0

Có vẻ như bạn đã đúng. Tôi đoán rằng try/catch không _not_ giới thiệu phạm vi, như đã được chứng minh bằng cách kiểm tra nhanh chóng này tôi đưa ra: http://jsfiddle.net/VRcwV/ –

+0

Oh chỉ thấy các chỉnh sửa! Vì vậy, nó không giới thiệu phạm vi, nhưng biến cục bộ được tạo ra bởi câu lệnh catch không có sẵn bên ngoài bắt. Vì vậy, nó giới thiệu một chút phạm vi chuyên ngành chỉ cho ngoại lệ đó? –

+1

@Squeegy: IE 8 là * không * tuân thủ, có vẻ như. Hãy thử kiểm tra của tôi (http://jsfiddle.net/DpHMt/) trong trình duyệt đó, và bạn sẽ thấy * cả hai * hộp cảnh báo đang mở. – PleaseStand

0

JSLint I use không hiển thị lỗi nào - và hợp lý mã của bạn là chính xác.

0

Cố gắng sử dụng một biến khác, có thể nó bị nhầm lẫn vì e thường được dành riêng cho trình xử lý sự kiện.

+0

theo như tôi biết 'e' không được đặt trước. – pex

0

Sử dụng biến khác cho mỗi lần thử/nắm bắt.

0

JSLint có thể đơn giản là sai ở đây. Theo thông số ECMAScript, nhập một khối catch tạo một phạm vi mới bên trong biến ngoại lệ được xác định. Trong ví dụ của bạn, e chỉ hợp lệ bên trong khối catch và không được xác định bên ngoài. Không có định nghĩa lại ở đây.

+1

Thông số ECMAScipt, chắc chắn. Nhưng trình duyệt thực hiện, dường như không: http://jsfiddle.net/VRcwV/ –

+0

@Squeegy: Nó chỉ là biến ngoại lệ 'e' đi vào phạm vi mới. Các biến được khai báo với 'var' luôn ở phạm vi hàm. Hãy thử 'alert (e)' và bạn sẽ thấy rằng nó không được định nghĩa bên ngoài khối 'catch'. – casablanca

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