범위 문제입니다.
아니요, 범위 지정 문제는 아닙니다. AJAX 작동 방식에 대한 이해가 문제입니다. AJAX는 비동기식입니다. 즉, AJAX 요청을 보내면이 요청을 보낸 함수 (귀하의 경우 $.getJSON
)가 즉시 반환됩니다. 성공 콜백 내부에서만 결과를 사용해야합니다. 이 콜백 함수는 훨씬 나중에 호출 될 수 있습니다. 그것은 미래에 어떤 순간에 이것이 일어날 지 당신에게 정말로 의존하지 않습니다. 서버에 오류가 발생하면 실제로는 절대로 발생할 수 없습니다.
그래서 당신은 확실하게 AJAX 호출 후 전송 서버가 성공 콜백 안에 그 결과를 소비 할 수있는 유일한 장소 :
$.getJSON("myJSON.js", function(json) {
// here and only here you can access the results of your AJAX call.
$('#console').append(JSON.stringify(json));
});
당신에게 동기 호출을 수행하는 것처럼 할 수있는 몇 가지 끔찍한 일이있다 서버 :
var myjson = { };
$.ajax({
url: 'myJSON.js',
dataType: 'json',
async: false,
success: function(json) {
myjson = JSON.stringify(json);
}
});
$('#console').append(myjson);
async: false
옵션은 동기식 호출을 만듭니다. 분명히 이것은 AJAX의 모든 목적을 완전히 무효로합니다. 왜냐하면이 호출 중에 브라우저를 멈출 것이기 때문입니다. 직접 스크립트 태그와 myJSON.js
등의 아마 더 나은 :이 방법에서 얻을 수 있습니다
<script type="text/javascript" src="myJSON.js"></script>
또 다른 이점은 브라우저가이 스크립트는 완전히 다른 스크립트를 실행하기 전에로드되었는지 당신을 위해 확인하는 것입니다. 그래서 다음은 잘 작동 할 수 : 나중에 다음
<script type="text/javascript" src="myJSON.js"></script>
<script type="text/javascript">
var myjson = someJavascriptVariableThatYouDeclaredInMyJSON;
</script>
과 :
<script type="text/javascript">
$('#console').append(JSON.stringify(myjson));
</script>
참고로, 당신이 쓸 수있는'{}'대신 새 개체'의()'. – ThiefMaster
@ ThiefMaster. 아니면 콜백 밖에서 반환 값을 사용할 수 없기 때문에 그냥 삭제하십시오. – gdoron
네, 당연히 더 낫지 만 - 응용 프로그램의 다른 코드에 따라 'undefined'대신 빈 객체를 갖는 것이 더 나을 수도 있습니다. – ThiefMaster