eval(string) thực thi chuỗi như code JavaScript. Cực kỳ nguy hiểm — chỉ dùng khi cực kỳ cần thiết và input tin cậy tuyệt đối.
Cú pháp
eval(stringCode); // Trả về kết quả của code cuối cùng
Ví dụ từ bài gốc
<script>
const str = '{"name":"Ram", "age":"function() {return 27;}", "city":"New Jersey"}';
const obj = JSON.parse(str);
// Chuyển string "function() {return 27;}" thành function thật
obj.age = eval("(" + obj.age + ")");
document.write(obj.name + ' of Age ' + obj.age() + ' from city ' + obj.city);
// "Ram of Age 27 from city New Jersey"
</script>
⚠️ Nguy hiểm của eval()
- XSS (Cross-Site Scripting): Input user chứa code độc hại → thực thi trên trình duyệt nạn nhân.
- Performance: Engine không thể tối ưu hóa (JIT compilation) code trong eval.
- Scope pollution: eval truy cập và sửa biến local/global.
- Debugging khó: Stack trace không rõ dòng code.
Thay thế an toàn
1. Function Constructor (vẫn rủi ro nhưng tách scope)
const func = new Function('arg1', 'arg2', 'return arg1 + arg2;');
func(2, 3); // 5
// Không truy cập local scope — chỉ global scope
2. JSON.parse() cho data (Không thực thi code)
// Thay vì eval('(' + jsonStr + ')')
const data = JSON.parse(jsonStr); // Chỉ parse data, KHÔNG chạy code
3. Lookup object / Map cho dynamic function
const handlers = {
add: (a, b) => a + b,
multiply: (a, b) => a * b
};
const op = 'add';
handlers[op](2, 3); // 5 — an toàn, không eval
4. Template literal tag function (Advanced)
function safeEval(strings, ...values) {
// Xử lý template string an toàn
return strings.reduce((acc, str, i) => acc + str + (values[i] || ''), '');
}
Khi nào BUỘC PHẢI dùng eval? (Hiếm)
- REPL / Console tool tự viết.
- Code generation tool (Babel, Webpack) — chạy trong build time, không runtime user.
- Math expression parser từ user input (cần sandbox kỹ).
Kết luận
Tránh eval() hoàn toàn trong production code. Luôn có giải pháp thay thế an toàn, rõ ràng, performant hơn.