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