programing

JavaScript의 eval에 JSON 데이터를 평가할 때 괄호가 필요한 이유는 무엇입니까?

magicmemo 2023. 4. 1. 09:01
반응형

JavaScript의 eval에 JSON 데이터를 평가할 때 괄호가 필요한 이유는 무엇입니까?

JSON 데이터 주위에 다음과 같이 괄호를 추가해야 한다는 것을 배웠습니다.

stuff = eval('(' + data_from_the_wire + ')');
// where data_from_the_wire was, for example {"text": "hello"}

(적어도 Firefox 3에서는).

이 배경은 무엇입니까?난 후드 뒤에 뭐가 있는지 모르면서 코드 쓰는 게 싫어.

eval는 일련의 Javascript 문을 받아들입니다.Javascript 파서는 문 내에서 발생하는 '{' 토큰을 개체 리터럴의 시작이 아니라 블록의 시작으로 해석합니다.

리터럴을 다음과 같이 괄호로 묶는 경우:({ data_from_the_wire })Javascript 파서를 식 구문 분석 모드로 전환합니다.식 내부의 토큰 '{'는 블록이 아닌 객체 리터럴 선언의 시작을 의미하므로 Javascript는 이를 객체 리터럴로 받아들입니다.

괄호 둘레에 끼우다data_from_the_wire사실상 와 동등하다

stuff = eval('return ' + data_from_the_wire + ';');

괄호 없이 평가하면 코드가 평가됩니다.또, 그 안에 이름 있는 함수가 있는 경우, 이러한 함수는 정의되지만 반환되지 않습니다.

함수가 생성되었을 때 호출할 수 있는 기능을 예로 들어 보겠습니다.

(function() { alert('whoot'); })()

방금 정의된 함수를 호출합니다.다만, 다음의 기능은 기능하지 않습니다.

function() { alert('whoot'); }()

따라서 괄호 안의 코드는 실행할 코드가 아니라 반환되는 표현식으로 효과적으로 변환됩니다.

이유는 모르겠지만 json.org의 JSON 클래스를 사용하여 JSON을 해석하고 있습니다.eval을 사용하는 것보다 훨씬 안전합니다.

JavaScript 에서는 블록문을 작성하기 위해 다음과 같은 중괄호를 사용합니다.

{
var foo = "bar";
var blah = "baz";
doSomething();
}

위의 행은 스트링 안에 넣을 수 있습니다.eval문제없이 사용.이 점에 대해 생각해 봅시다.

{
"foo": "bar",
"blah": "baz"
}

괄호로 묶으면 JavaScript 엔진이 그룹 표현으로 간주되기 때문에,:성격.MDN에서 인용...JavaScript 가이드...오브젝트 리터럴:

스테이트먼트의 선두에 오브젝트 리터럴을 사용하지 말아 주세요.{는 블록의 시작 부분으로 해석되기 때문에 오류가 발생하거나 예상대로 작동하지 않습니다.

오브젝트 리터럴을 안으로 랩하는 회피책()는, 그 내용을 블록문이 아닌 표현식으로 처리하도록 엔진에 지시하는 것으로 동작합니다.이것은 동작하지 않습니다.

({
var foo = "bar";
var blah = "baz";
doSomething(evil);
})
// parse error

단, 이 점은 다음과 같습니다.

({
"foo": "bar",
"blah": "baz"
})
// returns object

괄호를 가 JavaScript의 해석을 입니다.{"text": ...라벨로 표시되며 실패합니다.콘솔에서 시도하면 "잘못된 라벨" 오류가 나타납니다.

data_from_the_wire의 경우 , 구문하는 행이 있습니다.{라벨로 해석되어 무효가 됩니다.괄호로 둘러싸면 파서가 식을 잘못 해석하지 않습니다.

그냥 구문 분석 문제에요, 정말로요.문자열, 숫자 또는 함수만 있으면 그런 문제가 없을 것입니다.

한 가지 해결책은 표현식이 아니라 명령을 항상 평가하는 것입니다.쓸 수 있다

eval('var stuff = {"text": "hello"}');

이 만, 르르요 in의 것 . 사실 이 질문에 대한 해답에 관심이 있어요. 하지만 제 추측으로는 괄호 없이 데이터 안에data_from_the_wire폐쇄로 해석될 수 있습니다.괄호가 평가를 강제하기 때문에 연관 배열이 '반환'될 수 있습니다.

이것이 =)의 다운베이트로 이어지는 추측입니다.

편집

Douglas Crockford는 의 JSON 사이트에서 문법이 모호하다고 언급했지만 그것은 나에게 큰 도움이 되지 않았다.

언급URL : https://stackoverflow.com/questions/964397/why-does-javascripts-eval-need-parentheses-to-eval-json-data

반응형