2014-08-30 4 views
0

jQuery를 사용할 준비가 된 문서에서 일부 Node.js가 작동하고 있습니다. 두 파일 모두 준비된 문서가 있습니다. 그러나 한 파일은 다른 파일을 호출하고 함수를 인식하지 못합니다. ReferenceError : SocketGameOut이 정의되지 않았습니다.Javascript/JQuery 범위 문제

=========== File 1 ============= 

$(document).ready(function() { 

var socket = io.connect('http://local.baseball.com:3333'); 

socket.on('news', function (data) { 
    SocketBroadcastIn(data); 
}); 

socket.on('message', function (data) { 
    SocketGameIn(data); 
}); 

function SocketGameOut(outstring) { 
    socket.emit('clientData', outstring); 
} 

}); 

============ File 2 ============== 

$(document).ready(function() { 

    $("#login").click(function() { 

    var loginData = { command: 'login', user: $("#user").val(), pass: $("#password").val() } 
    var data = JSON.stringify(loginData); 

    SocketGameOut(data); <--This function call returns 
       ReferenceError: SocketGameOut is not defined 

}); 

}); 
+0

쉬운 방법 밖으로 것 SocketGameOut을 전역으로 만들 수 있습니다. 예를 들어 file1에서'document.ready' 안의 마지막 물건은'window.SocketGameOut = SocketGameOut'입니다. –

답변

1

이 함수는 변수와 동일한 범위 규칙 (사실 함수는 변수)을 따릅니다. 따라서 다른 함수 내에서 함수를 만들면 해당 함수에서만 볼 수 있습니다.

DOM을 조작하지 않으므로 첫 번째 파일에는 $(document).ready 이벤트가 필요하지 않습니다. 이를 제거하고 전역 범위에서 변수를 만들면 파일 1의 다른 부분과이 파일 뒤에 포함 된 모든 파일에 변수가 표시됩니다.

또 다른 방법은 $(document).ready 외부 변수에이 기능을 첨부하는 것입니다, 그래서 전역 범위에있을 것입니다,하지만 여기에 불필요하며 첫 번째 방법이 훨씬 더 좋을 것이다 :

var SocketGameOut; 
$(document).ready(function() { 
    //your code... 
    SocketGameOut = function (outstring) { 
     socket.emit('clientData', outstring); 
    } 
    //your code... 
}); 
+0

+1, 간결한 답변. –

+0

감사합니다, 매력처럼 일했습니다! –