Như nhiều lần nói, nó được coi là xấu thực hành để sử dụng Function constructor (cũng thấy ECMAScript Language Specification, 5 thứ edition, § 15.3.2.1):sử dụng hợp pháp của các nhà xây dựng Chức năng
new Function ([arg1[, arg2[, … argN]],] functionBody)
(nơi mà tất cả đối số là các chuỗi chứa các tên đối số và chuỗi cuối cùng (hoặc chỉ) chứa nội dung hàm).
Để tóm lại, nó được cho là chậm, như được giải thích bởi the Opera team:
Mỗi lần [...] các nhà xây dựng
Function
được gọi vào một chuỗi đại diện cho mã nguồn, động cơ kịch bản phải bắt đầu máy móc chuyển đổi mã nguồn thành mã có thể thực thi. Điều này thường là tốn kém cho hiệu suất - dễ dàng một trăm lần đắt hơn một hàm đơn giản gọi, ví dụ. (Mác ‘Tarquin’ Wilton-Jones)
Mặc dù nó không phải rằng xấu, theo this post trên MDC (Tôi đã không kiểm tra này bản thân mình bằng cách sử dụng phiên bản hiện tại của Firefox, mặc dù).
Crockford adds rằng
[t] ông trích dẫn ước của ngôn ngữ làm cho nó rất khó để diễn tả một cách chính xác một cơ quan chức năng như là một chuỗi . Ở dạng chuỗi, đầu tiên không thể thực hiện kiểm tra lỗi . […] Và nó lãng phí bộ nhớ vì mỗi hàm yêu cầu thực hiện độc lập của riêng mình.
khác biệt nữa là
một chức năng được xác định bởi một hàm constructor không thừa hưởng bất kỳ phạm vi khác ngoài phạm vi toàn cầu (mà tất cả chức năng kế thừa). (MDC)
Ngoài ra, bạn phải chú ý tránh việc tiêm mã độc khi bạn tạo new Function
sử dụng nội dung động.
Điều đó nói rằng, T.J. Crowder nói trong an answer rằng
[t] ở đây hầu như không bao giờ bất cứ nhu cầu sự tương tự [...] Chức năng mới (...), một trong hai, một lần nữa, ngoại trừ đối với một số trường hợp cạnh tiên tiến.
Vì vậy, bây giờ tôi tự hỏi: "những trường hợp cạnh tiên tiến" là gì? Có sử dụng hợp pháp nào của hàm tạo hàm không?
ES5 ở chế độ nghiêm ngặt không ném khi 'chức năng mới' được sử dụng ... –
@ Šime: Theo thông số (Phụ lục C), cần:“ Cố gắng tự động xác định chức năng chế độ nghiêm ngặt như vậy bằng cách sử dụng Hàm constructor (15.3.2) sẽ ném một ngoại lệ 'SyntaxError', nhưng một thử nghiệm đã tiết lộ nó không. Tôi có hiểu nhầm điều gì đó không? –
Vâng, hãy đọc câu trên. "Như một chức năng chế độ nghiêm ngặt" đề cập đến một chức năng mà một trong hai tên hoặc một trong các tham số là "eval" hoặc "đối số". –