2017-05-22 1 views
0

누군가 관심을 갖고 몇 시간을 절약 할 수 있습니다. 번거로운 번거 로움, eval이 한 파일에서 나오고 함수가 두 번째 파일에서옵니다. catch되지 않은 형식 오류 :eval은 함수가 아닙니다.

eval('console.log(0)') 
(function(x){console.log(x)})(1) 

이 함께 발생합니다 함수

가 아닌 평가 (...)를하고이 세미콜론 누락 수정

eval('console.log(0)'); 
(function(x){console.log(x)})(1) 

, 내가 몇 번을 읽었 JS의 세미콜론은 대부분 선택 사항입니다.

의견이 왜 eval이이 컨텍스트의 함수가 아닌지?

+0

세미 콜론 삽입은 선택 사항이지만, JS 엔진이 실제로 세미 콜론을 삽입 할 때가 언제인지 이해하는 것이 좋습니다. 이 대답을 읽으면서 https : // stackoverflow가 도움이 될 것입니다.com/questions/2846283/what-are-the-rules-for-javascripts-automatic-semicolon-insertion-asi – Agalo

+0

여기서 공과는 항상 번들에있는 파일 사이에 세미콜론을 붙입니다. – maciejW

답변

1

이것은 자바 스크립트의 semicolon insertion이 당신을 여행 할 몇 가지 상황 중 하나입니다.

이 코드 :

eval('console.log(0)') 
(function(x){console.log(x)})(1) 

이 코드에 동일합니다 : 즉

eval('console.log(0)')(function(x){console.log(x)})(1) 

, 자바 스크립트는 생각 당신이 매개 변수와 함께 호출하려는 함수로 표현 eval('console.log(0)') 평가 (function(x){console.log(x)}). 분명히 의도 한 것이 아니므로, 줄 끝에서 세미콜론이 필요합니다.

3

JS 런타임은 세미콜론이 어디로 가야하는지 짐작하기에 완벽하지 않습니다.

는이 볼 때 :

eval('console.log(0)') 
(function(x){console.log(x)})(1) 

이 잘못 즉시 호출 함수 표현식의 결과가 eval 선합니다 (eval가 평가 잠재적 함수에 전달 될 수있는 잠재적 인 매개 변수의 일부 라 가정).

여기 그것이 작동 할 때의 예 :

eval("(function(message){ alert(message); })") 
 
("Hi there!");

그러나, 귀하의 경우, eval 그래서 실패에 인수를 전달하기 위해 노력하고, 함수에 평가하지 않습니다, 따라서 오류 메시지.

그러나 실제로는 eval()과 관련이 적습니다. 이것은 세미콜론이 IIFE 나 (으로 시작하는 표현식 바로 전에 생략 될 때마다 팝업 될 수 있습니다.

세미콜론을 추가하면 런타임에서 IIFE가 분리되었음을 알 수 있습니다.

( 다음에 오는 모든 행에 세미콜론을 삽입해야합니다 (식이 시작되는 방식이므로). 별도로 유지해야합니다. 그러나 더 나은 규칙은 자동 세미콜론 삽입에 전혀 의지하지 않고 항상 자신 안에 넣는 것입니다.

+0

이것은 내 추측 이었지만 이것을 발견하는 것은 꽤했습니다. 악몽인데, 이런 종류의 코드는 손으로 작성된 것이 아니기 때문에, 제 3 자 libs의 concat이다. – maciejW

+1

@maciejW 아, 그런데'eval() '의 사용은 처음에는 매우 낙심했다. 그것은 크로스 사이트 스크립팅 공격을 야기 할 수 있으며 느리게 진행되며 수정 된 스코프 체인에서 실행됩니다. 거의 항상 eval()이 필요없는 코드를 리팩토링하는 방법이 있습니다. –

관련 문제