Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Chuyển chuỗi thành Function trong JavaScript (eval)

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.