Проверяет синтаксис, который компилятор React не поддерживает. Если такой синтаксис нужен, его всё равно можно использовать вне React, например в отдельной вспомогательной функции.
Компилятору React нужно статически анализировать код, чтобы применять оптимизации. Возможности вроде eval и with не дают на этапе компиляции статически понять, что делает код, поэтому компилятор не может оптимизировать компоненты, которые их используют.
// ❌ Using eval in componentfunctionComponent({code}){constresult=eval(code);// Can't be analyzedreturn<div>{result}</div>;}// ❌ Using with statementfunctionComponent(){with(Math){// Changes scope dynamicallyreturn<div>{sin(PI/2)}</div>;}}// ❌ Dynamic property access with evalfunctionComponent({propName}){constvalue=eval(`props.${propName}`);return<div>{value}</div>;}
// ✅ Use normal property accessfunctionComponent({propName,props}){constvalue=props[propName];// Analyzablereturn<div>{value}</div>;}// ✅ Use standard Math methodsfunctionComponent(){return<div>{Math.sin(Math.PI/2)}</div>;}
Иногда нужно вычислить код, который передал пользователь:
12345
// ❌ Wrong: eval in componentfunctionCalculator({expression}){constresult=eval(expression);// Unsafe and unoptimizablereturn<div>Result:{result}</div>;}
Используйте безопасный разбор выражений:
1 2 3 4 5 6 7 8 910111213141516171819202122
// ✅ Better: Use a safe parserimport{evaluate}from'mathjs';// or similar libraryfunctionCalculator({expression}){const[result,setResult]=useState(null);constcalculate=()=>{try{// Safe mathematical expression evaluationsetResult(evaluate(expression));}catch(error){setResult('Invalid expression');}};return(<div><buttononClick={calculate}>Calculate</button>{result&&<div>Result:{result}</div>}</div>);}
Примечание
Никогда не используйте eval с пользовательским вводом: это угроза безопасности. Для конкретных задач — математических выражений, разбора JSON или вычисления шаблонов — берите специализированные библиотеки разбора.