2015-05-18 17 views
5

Có lý do gì khiến dòng mã này không thành công?Tương tác lạ giữa Chức năng mới và eval

new Function("eval('function foo(){ alert() }'); foo()")() 

Nó hiện ra cảnh báo trong Chromium như mong đợi nhưng không thành công trong Firefox (foo không được xác định). Đây có phải là lỗi của Firefox hay có vấn đề gì với mã của tôi không?

+0

Điều này nghe giống như chế độ nghiêm ngặt/không nghiêm ngặt - bạn có _sure_ bạn đã chạy cả hai chế độ này ở chế độ không nghiêm ngặt không? (Hành vi của Chrome) hoặc chế độ nghiêm ngặt (Firefox)? (Cập nhật: nhìn vào spec này có thể là một điều es5 và es2015 (es6)) –

+0

@BenjaminGruenbaum Tôi đã nghĩ về điều đó. Tôi khá chắc chắn rằng tôi chạy cả hai trong chế độ nonstrict. Nhưng chế độ nghiêm ngặt không nên có bất kỳ hiệu ứng nào, vì chức năng mới không nên phản ánh điều đó (không giống như chức năng thông thường). – user2345215

+0

Trong khi điều thú vị là các trình duyệt hoạt động khác nhau, tôi vẫn còn tự hỏi "tại sao chúng ta quan tâm?" XD –

Trả lời

-1

Vấn đề là eval không kế thừa phạm vi toàn cầu, do đó, foo được tạo ở một phạm vi khác với nơi nó được gọi. Bạn có thể giải quyết điều này bằng cách chỉ định phạm vi một cách rõ ràng, hoặc ở định nghĩa hàm hoặc bằng cách chuyển đến eval. I E. cả hai đoạn mã sau đều hoạt động như mong đợi:

new Function("eval('window.foo = function(){ alert() }'); foo()")() 

new Function("eval('function foo(){ alert() }', this); foo()")() 

Hành vi này dường như liên quan đến chế độ nghiêm ngặt, như được giải thích tại câu trả lời ở đây "use strict"; + jQuery.getScript() = script can't export to global namespace.

+1

'eval' không có ý định sử dụng phạm vi toàn cục, nhưng phạm vi hàm cục bộ mà nó được gọi (và trong đó' foo() 'được gọi). Ngoài ra đoạn thứ hai của bạn không có ý nghĩa, 'eval' doesnot mất một tham số thứ hai. – Bergi

+0

Nó thực sự https://dev.mozilla.jp/localmdc/localmdc_3355.html. Tuy nhiên, đối số thứ hai dường như đã không được chấp nhận, vì vậy người ta không nên dựa vào nó đang được thực hiện (mặc dù tôi đã thử nghiệm nó trong phiên bản mới nhất của Firefox và nó hoạt động) – taddeus

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