Tôi nhận thấy một kết quả thú vị từ JSLint trong khi nghiên cứu câu hỏi codereview. JSLint đã phàn nàn rằng một biến là được sử dụng trước khi được xác định. Dưới đây là một phiên bản rút gọn của mã mà tạo ra kết quả tương tự:var từ khóa trong các biểu thức try/catch: lỗi JSLint hoặc gán toàn cầu?
(function() {
try {
var a = 0;
throw { name: "fakeError" };
} catch (e) {
a = 1;
}
}());
sự hiểu biết của tôi về Javascript nói rằng các mã trên nên được tương đương với:
(function() {
var a;
try {
a = 0;
throw { name: "fakeError" };
} catch (e) {
a = 1;
}
}());
và trên thực tế, không phải ví dụ gây a
để tồn tại trong phạm vi toàn cầu khi chạy qua Firebug. Tôi đã xem phần 12.14 của số ECMA-262 spec, nhưng tôi không thấy bất cứ điều gì khiến tôi nghĩ rằng các chức năng cần được xử lý khác nhau. Đây có phải chỉ là một lỗi trong JSLint, hoặc là hai biểu thức khác nhau trong một số cách chức năng?