2014-02-06 5 views
0

저는 프로그램하는 법을 배우는 중이며 바이너리로 카운트하는 프로그램을 만들려고했습니다.바이너리로 계산하기

제공된 10 진수를 2 진수로 변환 할 수있는 함수를 만들었고 정상적으로 작동하는 것처럼 보였습니다.하지만 for 루프를 사용하여 위로 계산하려고하면 브라우저가 멈추고 이유를 이해할 수 없습니다. 비슷한 while 루프를 사용하면 필요한 결과를 얻을 수 있습니다.

문제는 하단에 주석 처리되어 있습니다. 제가 여기서 뭘 잘못하고 있는지 알아내는 데 도움주세요. 여기

내 코드입니다 : 당신은 toBinary 기능에 i를 선언하지 않은

function isOdd(num) {return num % 2}; 

var toBinary = function (number) { 
ints = []; 
binary = []; 
ints.push(Math.floor(number)); 

while (number >= 1) { 
    number = (Math.floor(number))/2; 
    ints.push(Math.floor(number)); 
} 

for (i=ints.length-1;i>=0;i--) { 
    if (isOdd(ints[i])) { 
     binary.push(1); 
    } else { 
     binary.push(0); 
    } 
} 

if (binary[0] === 0) { 
    binary.splice(0,1); 
} 

return binary; 

}; 

var count = 0; 
while (count <= 50) { 
console.log(toBinary(count)); 
count++; 
} 

/* 
for (i=1;i<=50;i++) { 
console.log(toBinary(i)); 
} 
*/ 

답변

1

사용 for (var i=ints.length-1;i>=0;i--)for (var i=1;i<=50;i++)이면 i은 전역 변수가되고 toBinary 안에 덮어 씁니다.

+0

솔직히 말해서 처음에는 답을 이해할 수 없었지만 루프 구문에서 var을 사용할 수있는 것으로 나타났습니다. 나는 시험해 보았다. 그리고 그것은 의도 된대로 일하고있다, 정말로 고마워! 그러나 개인적으로 나는 카운팅 루프의 변수 이름을 내가 다른 것보다 다른 것으로 변경했다면 계산 속도가 훨씬 빨라 졌음을 알았습니다. – ecchi

+0

하지만 변수 이름 만 변경해도 실제 문제는 해결되지 않습니다. 문제는 여러분이'i'와 전역 범위를 정의하고 있으며 이것이 다른 범위 안에서 이것이 무엇을 초래하는지 알지 못한다는 것입니다. 현재 프로그래밍을 배우고 있으므로 Javascript 범위에 대한 자습서를 살펴 보는 것이 좋습니다. – user1983983

+0

그래서 내가 한 일은 옳은 일이 아닙니다. 나는 범위에 대해 더 많이 읽을 것입니다. 고마워요! – ecchi

1

, 따라서 i 마지막 루프에서 toBinary의 모든 호출에 다시 정의하고, i는 50

에 도달하지 않습니다

사용 var은과 같이 변수를 선언합니다 :

var toBinary = function (number) {  
    var ints = [], 
     binary = [], 
     i; 
    : 
} 
+0

그래서 브라우저가 멈 추었습니다. 도와 주셔서 감사합니다! 이제 내 계산 루프에서 다른 변수 (i가 아님)를 사용하면 효과가 있을지 궁금합니다. – ecchi

+0

@TarasDzyadevich 네, 작동 할 수도 있습니다. 그러나 가능한 한 적은 전역 변수를 사용해야하며 심지어 전역 변수도 'var'로 선언해야합니다. user1983983이 제안했듯이 [MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope)에서 기능 및 기능 범위에 대한 자세한 내용을 볼 수 있습니다. – Teemu