Firefox diễn giải các câu lệnh hàm khác nhau và rõ ràng là chúng đã phá vỡ khai báo cho khai báo chức năng. (A good read about named functions/declaration vs expression)
Tại sao Firefox giải thích các báo cáo khác nhau là do đoạn mã sau:
if (true) {
function test(){alert("YAY");}
} else {
function test(){alert("FAIL");}
}
test(); // should alert FAIL
Do cẩu khai, chức năng test
nên luôn luôn cảnh giác "thất bại", nhưng không phải trong Firefox. Các mã trên thực sự cảnh báo "YAY" trong Firefox và tôi nghi ngờ mã mà làm cho điều đó xảy ra cuối cùng đã phá vỡ tuyên bố cẩu hoàn toàn.
Tôi giả định Firefox chuyển các khai báo hàm thành các khai báo var khi chúng được đặt trong câu lệnh if/else hoặc try/catch. Cũng giống như vậy:
// firefox interpretted code
var test; // hoisted
if (true) {
test = function(){alert("yay")}
} else {
test = function(){alert("fail")}
}
Sau một cuộc tranh luận ngắn với Šime Vidas, tôi phải nói rằng giao dịch của Firefox với tờ khai chức năng là phi tiêu chuẩn, vì:
The production SourceElement : Statement is processed for function declarations by taking no action.
The production SourceElement : Statement is evaluated as follows:
- Evaluate Statement.
- Return Result(1).
Cả FunctionDeclaration và Tuyên bố là SourceElements, ergo, không nên có FunctionDeclarations bên trong một câu lệnh (nếu/else, try/catch). Cho Šime Vidas một brownie!
Thử/nắm bắt về cơ bản là một dạng khác của if/else và có thể sử dụng cùng một mã ngoại lệ.
trình duyệt này thuộc loại nào? –
Đồng ý; nó không hoạt động (Firefox), nhưng câu hỏi tôi muốn hỏi là tại sao bạn cần điều này? Tại sao bạn cần đặt các khai báo hàm bên trong một khối try/catch? – Spudley
Firefox. Bây giờ tôi thấy rằng cả IE và Chrome đều hiển thị Hello world ... –