728x90
728x90
eval()은 문자열을 코드로 인식하게 하는 함수입니다.
ES5부터는 지역범위가 아니라 전역 범위에서 동작합니다. ** 즉 함수를 선언하면 전역함수가 되고, 실행 코드는 실행되는 위치의 지역 범위에 접근할 수 없습니다.
eval()
인자가 하나 이상의 JS 명령문을 나타낸다면 실행합니다.
인자가 문자열이 아니면 인자 그대로 반환합니다.
값이 없으면 undefined를 반환합니다.
eval 함수는 eval('2+2') 이런식으로 사용합니다.
var jb = '2+2';
document.write( '<p>' + jb + '</p>' );
document.write( '<p>' + eval( jb ) + '</p>' );
// 2+2
// 4
동적인 프로퍼티에 접근하려고 사용한다면 대괄호 표기법으로 대체할 수 있습니다. (출처) eval()은 Ajax 요청으로 받아온 JSON 응답을 다룰 때 이런 안티 패턴이 나오기도 하는데요.
// 안티 패턴
var property = 'name';
console.log(eval('obj.' + property));
// 권장 패턴
var property = 'name';
console.log(obj[property]);
보안과 유효성을 보장하기 위해서 브라우저의 내장 메서드를 사용해서 JSON 응답을 파싱하는 것이 좋습니다.
즉 JSON.parse()를 사용하는 것인데 미지원 브라우저에서는 JSON.org 의 라이브러리를 사용할 수 있습니다.
// 참고: 실행 가능한 모든 예시에 'use strict'가 적용되어있습니다.
eval("let x = 5; function f() {}");
alert(typeof x); // undefined (없는 변수)
// 함수 f도 읽을 수 없음
엄격 모드에서 eval은 자체 렉시컬 환경을 갖고 있어서 eval 내부에 선언된 함수와 변수는 외부에서 읽을 수 없습니다.
use strict가 적용되어 있지 않은 경우엔 eval은 자체 렉시컬 환경을 갖지 않기 때문에 외부에 있는 x와 f를 읽을 수 있습니다. (출처)
728x90
728x90
'Javascript' 카테고리의 다른 글
모던 자바스크립트 입문 : 9. 객체 (0) | 2020.10.21 |
---|---|
[JS/jQuery] click 이벤트 무한반복 / 중복 발생 처리 (0) | 2020.10.20 |
[JS] onchange 이벤트 사용, value 가져오기 (0) | 2020.09.22 |
JS 싱글톤, Atomics, 데드락, 크리티컬섹션, promise, async await (0) | 2020.09.22 |
[JS] replaceAll 대신하여 replace 정규식 사용하기 (0) | 2020.09.22 |