2017-11-16 8 views
0

현재 코드가 있습니다.소켓 socket.on 내에서 정의되지 않았습니다.

socket.on('KeyPress', function(data){ 
    var ply = PLAYER_LIST[socket.id]; 
    /* ... */ 
}); 

WebStorm은 socket.id가 초기화되지 않을 수 있습니다 나를 알리는되며,이 이벤트가 트리거 될 때 그것은 전체 코드의 내부 오류

TypeError: Cannot read property 'id' of undefined 

을 유발하는

io.sockets.on('connection', function(socket){ /*...*/ }); 

다음은 내가 사용하고있는 두 가지 방법 중 하나입니다. 당신이 아직 작동 같은 일을하고 있어요 볼 수있는 첫 번째 블록에서 enter image description here .. 그것은 사용자에 정식 socket.id를 사용하는 것이 얼마나 보안이 메모 또한

? 자신의 ID를 강제 설정할 수 있습니까?

+0

이미지로 코드를 게시하지 마십시오. 코드를 텍스트로 게시 한 다음 수동으로 다시 입력 할 필요없이 코드에 대한 수정 내용을 표시하기 위해 복사/붙여 넣기를 할 수 있습니다. 또한 이미지 검색 색인의 혜택도 누리지 못합니다. – jfriend00

답변

2

루프 내에서 var을 사용하여 변수를 정의한 후 "변수 호이 스팅 (hoisting)"의 영향으로 비트를 가져 오는 것은 나쁜 습관의 대상이됩니다. 함수의 어디에서든지 var으로 정의 된 변수가 자동으로 선언됩니다. 함수를 호출 한 다음 할당이 있던 곳에서 초기화합니다. 즉, 그 전에는 함수 내의 모든 곳에서 undefined을 의미합니다. 당신이 실제로 원하는 것을 숨 깁니다 socket라는 이름의 지역 변수를 재정의

var socket = SOCKET_LIST[i]; 

:

문제는이 코드 줄 것입니다. var으로 정의 된 변수의 범위는 기능 범위입니다. 이는 함수 상단에 정의되어 있음을 의미합니다 (가변 호이 스팅이라고 함). 따라서 다른 부모 범위가 socket 범위가 아닙니다. 다음과 같이 시작으로 함수의

생각한다

socket.on('KeyPress', function(data) { 
    var socket;  // this is hoisted from deeper inside the function 
         // and creates a new undefined socket variable 
    var ply = PLAYER_LIST[socket.id]; 

    // other code here 
}); 

이 자바 스크립트 코드를보고하는 방법을 본질적으로. "Javascript variable hoisting"에 대한 검색을 수행하고 자세한 정보가 필요하면 주제에 쓰여진 기사가 많이 보입니다.

이 로컬 변수의 이름을 다른 것으로 변경하는 가장 작은 변경은 부모 범위 변수를 방해하지 않지만 실제로는이 코드 구조가 처음에는 이상적이지 않습니다. 일반적으로

var localSocket = SOCKET_LIST[i]; 
var ply = PLAYER_LIST[p]; 
localSocket.emit(...) 

IT는 for 루프 내에서 var와 변수를 정의하는 나쁜 습관이다. "가정"은 그 루프에만 적용되지만 실제로는 전체 함수에 적용되며 루프 외부의 것들로 혼란 스러울 수 있습니다.

ES6에서 실제로대신 let 또는 const을 사용하여 루프의 블록에만 실제로 적용되는 변수를 선언 할 수 있습니다.

기타 참고 사항으로는 배열을 반복 처리하지 않아야합니다 (for/in). 이는 배열 요소뿐만 아니라 모든 배열 속성 (다른 열거 가능한 객체 속성 포함)을 반복합니다. ES6에서는이 방법으로 반복 배열에 for/of을 추가합니다. ES5에서는 더 일반적인 for 루프 또는 .forEach() 루프를 사용할 수 있습니다.

+0

@ bloodless2010 - 그 부분을 복사/붙여 넣을 수 있다면 내 대답에 더 많은 코드를 포함 시켰 겠지만 이미지에 코드를 게시하는 것은 큰 걸림돌입니다. – jfriend00

+0

와우! 나는 JavaScript가 이런 식으로 작동한다는 사실을 전혀 모르고 있다는 것을 놓쳤다는 것을 믿을 수 없다. 다른 언어로 연습 할 때 루프 스코프에만 있다고 가정했다. 순전히 지워 버려, 고마워! – bloodless2010