2011-02-04 3 views
7

Javascript의 eval()과 다른 접근법의 차이점을 설명 할 수 있는지 궁금 해서요. JQuery를 사용하여 스크립트 태그를 만든 다음 해당 요소를 페이지에 추가하는 것과 같습니다.eval()과 추가 스크립트 태그 간의 자바 차이점

eval(somecode); 

이 관련이 있지만, 여기 문맥의 경우
$("<script type='text/javascript'>"+somecode+"</script>").appendTo("head"); 

확실하지 : 나는 누구의 기본 목적은 쉽게 팝업으로 일반 링크를 설정하는 것입니다 드루팔 팝업 모듈의 버전으로 일하고 있어요 전체 페이지 요청을 AJAX로 보내고에 추가 모달 윈도우의 페이지. 여기에는 종종 외부 CSS 및 Javascript 파일이 포함됩니다. 이 AJAX 로딩의 성능을 향상시키기 위해 AJAX 대기열을 사용하도록 전환했으며 외부 스크립트의 eval()을 대안 목록으로 변경했습니다. 그러나 이로 인해 여러 다른 페이지에서 산발적 인 Javscript 버그가 발생했습니다.

+1

어쨌든 jquery로하고있는 일을하기 위해 eval을 어떻게 사용하는지 모르겠습니다. Eval은 json 응답 문자열을 배열로 변환하는 데 사용됩니다. –

+0

@MattPhillips eval은 코드를 평가합니다. – Raynos

+0

@Matt - jQuery에는 스크립트 태그의 문서에 추가하여 "eval"코드가 포함 된 내부 함수가 포함되어 있습니다.IIRC,'globalEval'은 동일한 도메인 스크립트와 JSONP를 포함하여 jQuery의 AJAX 함수에 광범위하게 사용됩니다. –

답변

2

글쎄 하나만 (차이가있는 한) eval은 표현식의 결과를 반환합니다.

var result = eval('3+4'); // result = 7 

는만큼 당신의 자바 스크립트 문자열 스크립트 블록의 구조에서와 같이, 나는 강력하게 JSON-P를 사용하는 것이 좋습니다

+6

더 정확하게 말하십시오. 'eval()'은 스크립트 태그가 아무 것도 반환 할 수없는 동안 평가 된 마지막 표현식의 결과를 반환합니다. –

+0

@alexandre - 사실, 더 정확하게 표현됩니다. 나는 갱신 할 것이다. –

+0

JSLint를 통해 코드를 실행해도 eval도 실패합니다. – Raynos

1

/스크립트 태그 내에 주입 제안했다.

즉석에서 스크립트 노드 (src = [url])를 생성하여 발신 AJAX 요청에 콜백 함수 이름을 추가하고 json 데이터로 콜백 함수를 호출하도록합니다. 페이지에서 콜백 함수를 정의하고 (적절한 네임 스페이스로) 업데이트 로직을 그 안에 넣습니다.

동적 스크립트 노드 콜백의 장점은 XHR과 같은 도메인 제한이 없다는 것입니다.

예를 들어, 귀하의 사이트는 www.foobar.com이고 일부 웹 서비스는 www.foobarapi.com에서 호스팅됩니다. 당신은 SRC와 런타임에 스크립트 노드를 만들 = "http://www.foobarapi.com/baz?a=foo1 & B =에서는 foo2 & 콜백 = foo.bar.baz"페이지에서 한편

, 당신은 : 같은

foo.bar.baz = function(data) { 
    // use the data 
} 

그리고 당신의 백엔드 서비스, PHP는 말, 볼 수 있습니다 : 스크립트 태그를 추가하면 동 기적으로 스크립트를로드

$a=$GET['a']; 
$b=$GET['b']; 
$callback = $GET['callback']; 
$c = someCalc($a, $b); 
echo $callback . "({ \"c\" : $c });"; 
+0

들어오는 데이터 JSONP를 친숙하게 만들어야합니다. 타사 외부 파일에는 유용하지 않습니다. – Raynos

+0

@Raynos : 동의합니다. –

+0

답변 해 주셔서 감사합니다.하지만 내 질문에만 관련이 있습니다. 나는 두 가지 접근법의 차이에 관한 정보를 찾고 있었는데, 다른 방법을 모두 함께 사용한다는 제안과는 달리, 상황에 따라 구현할 수있는 것이 아닙니다. – Oliver

1

, XHR을 통해 때 당신에게 평가 텍스트를로드하는 반면, 그 비동기로드 . 비동기로 인해 스크립트가 순서대로로드되지 않았을 수 있습니다.

참고로 10 억 개의 사례가 있지만 시나리오에 따라 달라질 수 있습니다.

이제 XHR을 동 기적으로로드 할 수 있지만 상황이 크게 느려집니다. 브라우저는 한 번에 6 개의 스크립트를로드 할 수 있지만 순서대로 실행합니다. XHR은 한 번에 하나씩로드됩니다.

+0

나는 일반적으로 브라우저가 한 번에 2 개의 요청만을 처리 할 수 ​​있다는 인상을 받았다. 그리고 실제로 각 파일을 동 기적으로로드하여 순서대로로드하고 팝업 페이지가 올바르게 시작되었는지 확인했기 때문에 나는 당황했다. 문제. 비동기 적 로딩을하고 싶지만, AJAX를 통해 외부 JS 및 CSS를로드 할 때 더 의미가있는 것처럼 보입니다. – Oliver

관련 문제