Điều này xảy ra do Firefox hay thiếu chức năng cẩu, như hình thành trong ECMAScript 5.
Chrome gán một cách chính xác giá trị cho f() trước khi chạy phần thân của hàm, phiên bản để là người đầu tiên của f() bị ghi đè bởi lần thứ hai.
SpiderMonkey (động cơ Javascript của Firefox) chạy mã mà không pre-assignin một giá trị cho f(), nên sử dụng giá trị duy nhất mà gặp trên đường: function f() { alert("yes"); };
chức năng cẩu là những gì?
Phạm vi chức năng của JavaScript có nghĩa là tất cả các biến được khai báo trong một hàm đều hiển thị trong toàn bộ phần thân của hàm. Thật kỳ lạ, điều này có nghĩa là các biến thậm chí còn có thể hiển thị trước khi chúng được khai báo là . Tính năng này của JavaScript được gọi chính thức là cẩu: Mã JavaScript hoạt động như thể tất cả các khai báo biến trong một hàm (nhưng không phải bất kỳ bài tập nào liên quan đến ) được "hoisted" lên trên cùng của hàm.
nguồn:
http://statichtml.com/2011/spidermonkey-function-hoisting.html
2011 - O'Reilly - javascript - sự dứt khoát dẫn 6 phiên bản