khi những người khác đã giải thích "cẩu" hành vi của các chức năng (cá nhân tôi thấy gọi đó là chuẩn bị bối cảnh hoặc tiền xử lý hơn rõ ràng hơn cẩu) lý do của hành vi khác nhau của Firefox vẫn chưa được trả lời.
Để bắt đầu, bạn nên biết sự khác biệt giữa Tuyên bố chức năng và Tuyên bố chức năng .
Một Tuyên bố Chức năng, như trong ví dụ của bạn có thể chỉ xảy ra ở hai nơi, trong mã toàn cầu (bên ngoài của bất kỳ chức năng) và trực tiếp trong cơ thể Chức năng của chức năng khác, ví dụ:
function foo() {}
function bar() {
function baz() {}
}
Tất cả các các hàm trên là các Khai báo hàm hợp lệ.
Các ECMAScript Đặc điểm kỹ thuật không cho phép để xác định khai báo Chức năng ở những nơi khác ví dụ trong Blocks:
if (true) {
function foo() {}
}
Chức năng trên nên cung cấp cho bạn một ngoại lệ SyntaxError
, nhưng hầu hết các trường là nhân từ, và họ vẫn sẽ xử lý trước (hoist) chức năng, ngay cả khi không thể truy cập chức năng thực tế (ví dụ: if (false) { function bar() {} }
).
Trong Firefox, cáo Chức năng được phép, có nghĩa là định nghĩa hàm thực sự xảy ra khi sự kiểm soát đạt rằng tuyên bố cụ thể, ví dụ:
if (true) {
function foo() { return true; }
} else {
function foo() { return false; }
}
Thi foo();
sau khi các báo cáo trên, trong Firefox sẽ sản xuất true
, bởi vì nhánh đầu tiên của câu lệnh if
thực sự được thực thi.
Trong các trình duyệt khác, foo();
sản xuất false
bởi vì tất cả các chức năng là tiền xử lý khi bước vào bối cảnh thực hiện, và người cuối cùng sẽ được ưu tiên, ngay cả khi false
chi nhánh của báo cáo kết quả if
là bao giờ đạt được.
Bảng điều khiển Firebug, thực thi mã của nó gói trong khối try-catch
, đó là lý do tại sao hàm này không có sẵn trước khi khai báo.
Nếu bạn cố gắng trên console:
console.log(typeof f); // "undefined"
function f() {}
Bạn sẽ thấy rằng f
không được chuẩn bị, nhưng nếu bạn quấn mã của bạn bên trong một hàm, bạn sẽ thấy những hành vi mong đợi:
(function() {
console.log(typeof f); // "function"
function f() {}
})();
Một lần nữa, đó là vì bây giờ f
được định nghĩa là Tuyên bố hàm, vì nó tồn tại trong phần nội dung của hàm ẩn danh và không phải là một phần của khối lệnh.
Đầu ra bàn điều khiển là gì? – wosis