Tôi đang xem section 13 hoặc đặc tả ECMAScript (câu 5). Biểu thức hàm ẩn danh được khởi tạo như sau:Tại sao các biểu thức hàm ẩn danh và các biểu thức hàm được đặt tên được khởi tạo khác nhau?
Trả về kết quả của việc tạo đối tượng hàm mới như được chỉ định trong 13.2 với các tham số được chỉ định bởi FunctionBodyListopt và nội dung được chỉ định bởi FunctionBody. Vượt qua trong môi trường LexicalEnvironment của bối cảnh thực thi đang chạy dưới dạng Phạm vi. Chuyển đúng như cờ Nghiêm ngặt nếu FunctionExpression được chứa trong mã nghiêm ngặt hoặc nếu FunctionBody của nó là mã nghiêm ngặt.
logic này là rất tương tự như cách khai báo hàm được khởi tạo. Tuy nhiên, lưu ý cách khởi tạo khác nhau của một biểu thức funciton được đặt tên là.
- Hãy funcEnv thể là kết quả của việc gọi NewDeclarativeEnvironment đi từ vựng Môi trường chạy thực hiện bối cảnh của như là đối số
- Hãy envRec được kỷ lục môi trường funcEnv của.
- Gọi phương thức cụ thể CreateImmutableBinding của envRec chuyển giá trị Chuỗi của Định danh làm đối số.
- Để đóng cửa là kết quả của việc tạo đối tượng hàm mới như được chỉ định trong 13.2 với các tham số được chỉ định bởi FormalParameterListopt và phần thân được chỉ định bởi FunctionBody. Vượt qua funcEnv làm Phạm vi. Vượt qua đúng như cờ Nghiêm ngặt nếu FunctionExpression được chứa trong mã số nghiêm ngặt hoặc nếu FunctionBody của nó là mã nghiêm ngặt.
- Gọi phương thức bê tông InitializeImmutableBinding của envRec chuyển giá trị Chuỗi của Mã định danh và đóng thành các đối số.
- Đóng cửa trở lại.
Tôi biết một trong những khác biệt lớn giữa tên/biểu thức chức năng ẩn danh được rằng biểu thức hàm có tên có thể được gọi là đệ quy từ bên trong chức năng, nhưng đó là tất cả tôi có thể nghĩ đến. Tại sao quá trình thiết lập lại khác biệt và tại sao cần thực hiện các bước bổ sung đó?
Có những sự tinh tế khác. Ràng buộc tên biểu thức hàm là chỉ đọc nhưng bạn vẫn được phép khai báo một var hoặc hàm sử dụng cùng tên trong phần thân của biểu thức hàm. Mô tả ngữ nghĩa này (hãy nhớ rằng đây chỉ là một đặc tả.) Yêu cầu sử dụng một bản ghi môi trường bổ sung. –
Thú vị. Nhưng tại sao điều này đòi hỏi hồ sơ môi trường bổ sung? Ví dụ, nếu ràng buộc định danh của NFE được tạo ra trong quá trình khai báo hàm (10.5) trước bước 5, bất kỳ khai báo var/function nào trong nguồn sẽ chỉ ghi đè ràng buộc của NFE (5f) thay vì đổ bóng nó. Thực tế cùng một hiệu quả, không? – kangax