위장평가
보안 문제
결론
eval 함수는 현재 범위에서 JavaScript 코드 문자열을 실행합니다.
var foo = 1; function test() { var foo = 2; eval('foo = 3'); return foo; } test(); // 3 foo; // 1
그러나 eval은 직접 호출되고 호출 함수가 eval 자체인 경우에만 현재 범위에서 실행됩니다.
var foo = 1; function test() { var foo = 2; var bar = eval; bar('foo = 3'); return foo; } test(); // 2 foo; // 3
번역가의 메모: 위 코드는 전역 범위에서 eval을 호출하는 것과 동일하며 다음 두 가지 작성 방법과 동일한 효과를 갖습니다.
// 写法一:直接调用全局作用域下的 foo 变量 var foo = 1; function test() { var foo = 2; window.foo = 3; return foo; } test(); // 2 foo; // 3 // 写法二:使用 call 函数修改 eval 执行的上下文为全局作用域 var foo = 1; function test() { var foo = 2; eval.call(window, 'foo = 3'); return foo; } test(); // 2 foo; // 3
어떤 조건에서도 eval을 사용하지 않아야 합니다. 상황이 작동합니다. eval을 사용하는 시나리오의 99.9%에는 eval을 사용하지 않는 솔루션이 있습니다.
위장된 평가
예약된 함수 setTimeout 및 setInterval은 모두 문자열을 첫 번째 매개변수로 허용할 수 있습니다. 이 문자열은 항상 전역 범위에서 실행되므로 이 경우 eval이 직접 호출되지 않습니다.
보안 문제
eval도 전달된 코드를 실행하므로 보안 문제가 있습니다. 코드 문자열을 알 수 없거나 신뢰할 수 없는 함수에서 나온 경우에는 eval을 사용하지 마세요.
결론
eval을 사용하지 마십시오. 이를 사용하는 코드는 작동 방식, 성능 및 보안 측면에서 의심스럽습니다. 일부 상황에서 제대로 작동하기 위해 eval을 사용해야 하는 경우 먼저 해당 디자인에 의문이 생길 수 있습니다. 이는 선호되는 솔루션이 아니어야 하며 eval을 사용하지 않는 더 나은 솔루션을 충분히 고려하고 우선 순위를 지정해야 합니다.
위는 JavaScript 고급 시리즈입니다. eval을 사용해보시면 어떨까요? 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!