2015-12-04 13 views
6

Tôi đang sử dụng hàm eval theo cách kỳ lạ, với tư cách là một hàm tạo.Không phải tất cả các hàm xây dựng hàm JavaScript đều không?

try { 
    var y = new eval() 
} catch(error) { 
    console.log("caught a " + error.name + ": " + error.message); 
} 

Nó ném lỗi như,

caught a TypeError: function eval() { [native code] } is not a constructor 

Như thông báo lỗi cho thấy, eval là một chức năng nhưng không phải là một nhà xây dựng.

Câu hỏi đặt ra là, không phải tất cả hàm javascript đều hoạt động như người xây dựng?

+0

eval là từ khóa dành riêng/một hàm gốc. Không gây rối với nó. –

+2

Không, một số ngoại lệ đáng chú ý khác là một số phương thức _DOM_ và hàm _arrow_ 'x => undefined' –

+0

Đồng ý, eval là hàm dựng sẵn. Nếu bạn đã tạo ra 'hàm myEval() {}' của riêng mình và sau đó sử dụng mã đó, nó sẽ ổn thôi. –

Trả lời

6

Không phải tất cả các hàm đều là hàm tạo.

Các nhà xây dựng là function values with a [[Construct]] internal property, không phải tất cả các chức năng đều có. Này được thực hiện rõ ràng trong 6.1.7.2 Object Internal Methods and Internal Slots của spec ngôn ngữ:

Một chức năng đối tượng không nhất thiết phải là một nhà xây dựng và các đối tượng chức năng phi constructor như không có một [[Xây dựng]] phương pháp nội bộ.

Sử dụng new hoặc Reflect.construct để gọi một tổ chức phi constructor như một constructor ném một TypeError.

+0

Những tác động thực tế của điều này là gì? Nếu tôi viết một hàm javascript, nó có được tự động gắn thẻ với phương thức nội bộ [[Construct]] này không? –

+0

@JohnCarpenter, nó phụ thuộc vào cách chức năng được tạo ra. Như @PaulS chỉ ra ở trên, việc tạo một hàm bằng cú pháp hàm mũi tên có nghĩa là nó sẽ không có thuộc tính [[Construct]]. Sử dụng từ khóa 'function' thường sẽ tạo ra một hàm có thể xây dựng. –

+0

Huh, thêm vào danh sách những thứ mà tôi không biết rằng tôi không biết. –

Các vấn đề liên quan