2017-03-13 2 views
1

나는이 할 경우객체의 값을 반환

var x = eval('{a:"b"}); 
console.log(x); // -> "b" 

내가 할 모든 객체 ("B")의 값이 아닌 키/재산, 또는 이상한 전체 개체 자체. 나는이 수행 할 때

하지만 지금

var x = eval('(function self(){return {a:"b"}})()'); 
console.log('x'); // -> {a:'b'} 

그것을 내가, 전체 객체를 기대하는 걸 줄 것으로 보인다. 근데 왜 이래? 왜 (자체 실행) 함수로 포장해야합니까?

문자열에서 일부 개체를 만들 때 eval을 사용하려고 생각하지만 더 잘 이해해야합니다. 있는 그대로 {a:"b"} 문은 다음과 같은 나타 내기 때문에

답변

3

있다는 :

  1. { ... }
  2. 에 의해 구분 된 코드 blocklabela:
  3. 문자열 리터럴 "b"

후자 인 only 표현식이 결과를 생성합니다.

그리고 AST 탐색기에서 같은 : 나는 "eval('({a:"b"})')

을 그러나 전체 아이디어 : 괄호 안에 그것을 포장 : https://astexplorer.net/#/gist/909bebf...

당신이 좋아, 먼저 표현으로 바꿀 필요가 객체를 반환하려면 문자열로부터 일부 객체를 생성하기 위해 eval을 사용하려고 생각합니다. "의심스러운 것으로 들립니다.

+0

JS 사양에서 {}을 (를) '코드 블록'으로 정의하지만 일반 JS 코드에서는 거의 볼 수 없다고 생각합니다. "코드 블록"은 어떻게 생겼습니까? 일반적으로 코드 블록은 함수의 컨텍스트에만 있습니다. –

+1

@AlexanderMills 블록을 항상 봅니다. if (true) {...} - 여기 코드 블록이 있습니다. 많은 것들이 하나의 구문을 "피연산자"로 받아들입니다. 블록이 여러 문장의 "컨테이너"역할을합니다. – zerkms

+0

@AlexanderMills : 희귀 한 코드 블록이 아니라 if, for, while 등에서 코드 블록을 사용합니다. 거의 사용되지 않고 거의 사용되지 않는 레이블입니다 – slebetman

관련 문제