>  기사  >  웹 프론트엔드  >  JavaScript 고급 시리즈 - eval을 사용하지 않는 이유

JavaScript 고급 시리즈 - eval을 사용하지 않는 이유

黄舟
黄舟원래의
2017-02-08 09:40:361349검색
  • 위장평가

  • 보안 문제

  • 결론

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)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.