2012-06-15 23 views
6

Có cách nào để chỉ định đối tượng nào cần sử dụng cho toàn cầu khi gọi eval()?Sử dụng eval() với tuỳ chỉnh toàn cầu

(Tôi không yêu cầu thế nào để làm eval toàn cầu().)

này không hoạt động nhưng điều này cho thấy những gì tôi muốn:

var pseudoGlobal = {}; 
eval("x = 12", pseudoGlobal); 
pseudoGlobal.x; // 12 

Điểm có ích là các ràng buộc toàn cầu thực sự là không bị ảnh hưởng bởi khai báo biến tiềm ẩn (tức là không có var từ khóa) trong mã eval() 'ed.

Đối với eval.call(pseudoGlobal, "x=12") hoặc eval.apply(pseudoGlobal, ["x=12"]), một số thông dịch viên sẽ không cho phép.

+1

Mục đích là tạo một môi trường thực thi được cô lập/kiểm soát/bảo mật trong chính Javascript. – gawi

Trả lời

3

Bạn có thể, tất nhiên, đối tượng mặc định thay thế cho gán một giá trị bất động sản, như trong

with (pseudoGlobal) eval("x=12") 

nhưng không phải cho tạo một propery. Nếu một thuộc tính không được tìm thấy trong ngăn xếp hiện tại của các ngữ cảnh thực thi, nó được tạo ra trong đối tượng toàn cầu. Thats tất cả để có nó. Bạn có thể thử một số những điều kỳ lạ, cũng:

//global code 
var globalvars = {}; 
for (i in this) 
    globalvars[i] = null; 
with (pseudoGlobal) 
    eval("x=12") 
for (i in this) 
    if (!(i in globalvars)) 
{ 
    pseudoGlobal[i] = this[i]; 
    delete this[i]; 
} 

Nếu bạn quan tâm đến các ràng buộc toàn cầu, hãy thử:

var globalvars = {}; 
for (i in this) 
    globalvars[i] = this[i]; 
with (globalvars) 
    eval("x=12") 

cách này các ràng buộc sẽ được thay đổi trong globalvars. Lưu ý rằng bản sao nông sẽ chỉ ngăn cản một cấp độ bingings thay đổi.

+0

Về khối mã thứ hai của bạn, điều này không ngăn chặn một tập lệnh thay đổi các ràng buộc trong đối tượng toàn cầu thực. – gawi

+0

Tôi lấy câu hỏi của bạn theo mệnh giá, nhưng vẫn không phải là tất cả bị mất ... Cập nhật câu trả lời –

+0

Và nếu tôi làm 'eval ('" sử dụng nghiêm ngặt ";' + code)', trong khi nó hạn chế mã có thể được eval() 'ed, điều này ngăn cản các ràng buộc bổ sung được tạo ra trong phạm vi toàn cầu. Điều này khiến chúng ta có những đột biến có thể có của các ràng buộc cấp 2 +. – gawi

1

Không có cách nào tích hợp để thực hiện việc này.

Có hai giải pháp mà tôi suy nghĩ:

  • Prefix tất cả các bài tập trong các mã eval ed. tức là, thay vì x = 12, bạn sẽ phải làm điều gì đó như o.x = 12.
  • Viết trình thông dịch Javascript của riêng bạn để sandbox tập lệnh và trả về một đối tượng có tất cả các biến được gán.
+0

Quá tệ, chúng tôi không thể tạo môi trường thực thi của riêng mình bằng Javascript. Phải tồn tại một số lý do tốt cho Javascript để ngăn chặn điều này. Tôi có cảm giác rằng nó phức tạp hơn một chút so với tôi nghĩ (chuỗi Prototype? Constructors? Các hàm nguyên gốc?). – gawi

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