Tôi có một chút mã JavaScript được chỉ định trong tệp cấu hình ở phía máy chủ. Vì tôi không thể chỉ định một hàm JavaScript trong ngôn ngữ cấu hình (Lua), tôi có nó như một chuỗi. Các máy chủ trả về chuỗi trong một số JSON và tôi có khách hàng giải thích nó bằng cách sử dụng chức năng dọn dẹp:JavaScript eval() "lỗi cú pháp" khi phân tích chuỗi hàm
parse_fields = function(fields) {
for (var i = 0; i < fields.length; ++i) {
if (fields[i].sortType) {
sort_string = fields[i].sortType;
fields[i].sortType = eval(sort_string);
}
return fields;
}
};
Vì vậy, về cơ bản nó chỉ đánh giá sortType
nếu nó tồn tại. Vấn đề là Firebug đang báo cáo "Lỗi cú pháp" trên dòng eval()
. Khi tôi chạy các bước tương tự trên giao diện điều khiển Firebug, nó hoạt động không có vấn đề gì và tôi có thể thực thi hàm như tôi mong đợi. Tôi đã thử một số biến thể khác nhau: window.eval
thay vì đồng bằng eval
, lưu trữ sortType
như tôi đã thực hiện ở trên và thử các biến thể nhỏ cho chuỗi.
Giá trị mẫu là fields[i].sortType
là "function(value) { return Math.abs(value); }"
. Đây là thử nghiệm tôi đã làm trong Firebug console:
>>> sort_string
"function(value) { return Math.abs(value); }"
>>> eval(sort_string)
function()
>>> eval(sort_string)(-1)
1
và lỗi chính nó trong Firebug:
syntax error
[Break on this error] function(value) { return Math.abs(value); }
Bit cuối cùng có thể có liên quan là điều này là tất cả được bọc trong một Ext JS onReady()
chức năng, với sự thay đổi không gian tên Ext.ns
ở trên cùng. Nhưng tôi giả định rằng window.eval
sẽ gọi toàn cầu là eval
, bất kể bất kỳ có thể nào eval
trong các không gian tên cụ thể hơn.
Bất kỳ ý tưởng nào được đánh giá cao.
Lưu ý rằng trình duyệt IE có thể chức năng không eval. – SLaks
thử 'var foo = function (value) {...}' –
@SLaks: 'eval' hoạt động tốt cho tôi trong IE đối với chuỗi ở trên, không có lỗi ... cũng như' eval ("a = function () {return 'b';} ")' - bạn có thể làm rõ ý bạn muốn nói gì không? –