2017-03-07 3 views
0

프라임 분해와 관련된 일부 함수를 작성했는데 함수 단락과 같은 결과를 테스트 할 때 테스트 단락을 확인할 때 document.getElementById("text")으로 잘 작동하는 것으로 나타났습니다. 그러나 전역 변수 textvar text = document.getElementById("text")으로 선언 한 다음 더 긴 버전을 text으로 대체하면 더 이상 작동하지 않습니다. 그러나 나는 로컬에서 text을 선언했을 때 작동한다는 것을 알았습니다. 왜 그런가요? 어떻게 고칠 수 있습니까? 내 JSFiddle은 여기에 있습니다 : https://jsfiddle.net/MCBlastoise/3ehcz214/변수가 로컬에서만 작동합니다

을 그리고 이것은 내 코드입니다 :

var text = document.getElementById("text"); 
 

 
function isPrime(num) { 
 
    var lastDigit = parseInt((num + "").split("").reverse()[0]); 
 
    if (typeof num !== "number" || num <= 1 || num % 1 !== 0) { 
 
    \t return undefined; 
 
    } 
 
\t else if (num === 2) { 
 
    \t return true; 
 
    } 
 
    else if (lastDigit === 0 || lastDigit === 2 || lastDigit === 4 || lastDigit === 5 || lastDigit === 6 || lastDigit === 8) { 
 
    \t return false; 
 
    } 
 
    else { 
 
    for (var i = 2; i < num; i++) { 
 
    \t if (num % i === 0) { 
 
     return false; 
 
     } 
 
    } 
 
    return true; 
 
    } 
 
} 
 

 
function factorSplit(dig) { 
 
    if (typeof dig !== "number" || dig <= 1 || dig % 1 !== 0) { 
 
    return undefined; 
 
    } 
 
    else if (dig === 2) { 
 
    \t return undefined; 
 
    } 
 
    else { 
 
    \t var factor; 
 
    \t for (var i = 2; i < dig; i++) { 
 
    \t \t if (dig % i === 0) { 
 
    \t \t \t factor = i; 
 
\t \t \t \t break; 
 
    \t \t } 
 
    \t } 
 
    \t if (factor === undefined) { 
 
    \t return undefined; 
 
    \t } 
 
\t \t else { 
 
    \t \t return [factor, (dig/factor)]; 
 
\t \t } 
 
    } 
 
} 
 

 
function allPrimes(arr) { 
 
\t if (Array.isArray(arr) === false || arr.length < 1) { 
 
\t \t return undefined; 
 
\t } 
 
\t else { 
 
    for (var i = 0; i < arr.length; i++) { 
 
    \t \t if (isPrime(arr[i]) !== true) { 
 
    \t \t \t return false; 
 
    \t } 
 
    \t } 
 
\t \t return true; 
 
\t } 
 
} 
 

 
function primeFactors(int) { 
 
\t if (typeof int !== "number" || int <= 1) { 
 
    \t return undefined; 
 
    } 
 
    else if (isPrime(int) === true) { 
 
    \t return false; 
 
    } 
 
    else { 
 
    \t var initFactors = factorSplit(int); 
 
    \t while (allPrimes(initFactors) !== true) { 
 
    \t \t initFactors = initFactors.concat(factorSplit(initFactors[initFactors.length - 1])); 
 
    \t initFactors.splice((initFactors.length - 3), 1); 
 
    \t } 
 
    \t return initFactors; 
 
    } 
 
} 
 

 
function listPrimes() { 
 
\t repeat = setInterval(findPrime, 1); 
 
} 
 

 
var primeInts = [2]; 
 
var check; 
 
function findPrime() { 
 

 
    var i = primeInts[primeInts.length - 1] + 1; 
 
\t if (check === undefined) { 
 
\t \t check = true; 
 
\t \t text.innerHTML = primeInts[0]; 
 
\t } 
 
\t else { 
 
\t \t while (isPrime(i) !== true) { 
 
\t \t \t i++; 
 
\t \t } 
 
\t \t primeInts.push(i); 
 
\t \t text.innerHTML += ", " + primeInts[primeInts.length - 1]; 
 
\t } 
 
} 
 

 
//text.innerHTML = isPrime(6);
<div onclick="listPrimes()" style="cursor:pointer; background-color:black; width:30px; height:30px"></div> 
 
<p id="text"></p>
텍스트는 전역

+0

문제가 무엇인지 확실하지 않습니다. 당신은 전역'텍스트'를 사용하고 싶습니까? –

+0

그 혼란스러운 부분은 아무것도 변경하지 않습니다. 코드에는 아무런 문제가없는 것처럼 보이지만 주석을 달아도 기능이 동일합니다. –

+0

@JonathanPortorreal 한 번 요소 (ID 텍스트가있는 단락)를 전역 적으로 정의한 다음 모든 기능에서 사용할 수있게하려고합니다. 그러나 필자는 모든 기능에서 요소를 다시 로컬로 정의해야했습니다. 이것은'findPrime()'에서 주석 밑의 행을 주석 처리하여 관찰 할 수 있습니다. 요소를 로컬에서 재정의하는 것이 왜 필요한지 알 수 없습니다. – MCBlastoise

답변

0

, 당신은 단지 전체 스크립트 파일을 HTML에 포함되어 있는지 확인해야합니다. 여기에 이미 우리를 위해이 작업을 수행 유래 코드 조각에서 여기

을 무엇을 의미하는지의 예입니다. 스크립트가 처음 /로드를 실행하고 머리에

var text = document.getElementById("text"); 
 

 
function isPrime(num) { 
 

 
    var lastDigit = parseInt((num + "").split("").reverse()[0]); 
 
    if (typeof num !== "number" || num <= 1 || num % 1 !== 0) { 
 
    return undefined; 
 
    } else if (num === 2) { 
 
    return true; 
 
    } else if (lastDigit === 0 || lastDigit === 2 || lastDigit === 4 || lastDigit === 5 || lastDigit === 6 || lastDigit === 8) { 
 
    return false; 
 
    } else { 
 
    for (var i = 2; i < num; i++) { 
 
     if (num % i === 0) { 
 
     return false; 
 
     } 
 
    } 
 
    return true; 
 
    } 
 
} 
 

 
function factorSplit(dig) { 
 

 
    if (typeof dig !== "number" || dig <= 1 || dig % 1 !== 0) { 
 
    return undefined; 
 
    } else if (dig === 2) { 
 
    return undefined; 
 
    } else { 
 
    var factor; 
 
    for (var i = 2; i < dig; i++) { 
 
     if (dig % i === 0) { 
 
     factor = i; 
 
     break; 
 
     } 
 
    } 
 
    if (factor === undefined) { 
 
     return undefined; 
 
    } else { 
 
     return [factor, (dig/factor)]; 
 
    } 
 
    } 
 
} 
 

 
function allPrimes(arr) { 
 
    if (Array.isArray(arr) === false || arr.length < 1) { 
 
    return undefined; 
 
    } else { 
 
    for (var i = 0; i < arr.length; i++) { 
 
     if (isPrime(arr[i]) !== true) { 
 
     return false; 
 
     } 
 
    } 
 
    return true; 
 
    } 
 
} 
 

 
function primeFactors(int) { 
 
    if (typeof int !== "number" || int <= 1) { 
 
    return undefined; 
 
    } else if (isPrime(int) === true) { 
 
    return false; 
 
    } else { 
 
    var initFactors = factorSplit(int); 
 
    while (allPrimes(initFactors) !== true) { 
 
     initFactors = initFactors.concat(factorSplit(initFactors[initFactors.length - 1])); 
 
     initFactors.splice((initFactors.length - 3), 1); 
 
    } 
 
    return initFactors; 
 
    } 
 
} 
 

 
function listPrimes() { 
 
    repeat = setInterval(findPrime, 1); 
 
} 
 

 
var primeInts = [2]; 
 
var check; 
 

 
function findPrime() { 
 

 
    var i = primeInts[primeInts.length - 1] + 1; 
 
    if (check === undefined) { 
 
    check = true; 
 
    text.innerHTML = primeInts[0]; 
 
    } else { 
 
    while (isPrime(i) !== true) { 
 
     i++; 
 
    } 
 
    primeInts.push(i); 
 
    text.innerHTML += ", " + primeInts[primeInts.length - 1]; 
 
    } 
 
} 
 

 
function test() { 
 
    console.log("inside test1") 
 
    console.log(text); 
 
    text.innerHTML = "testtt" 
 
} 
 

 
function test2() { 
 
    console.log("inside test2") 
 
    console.log(text); 
 
    text.innerHTML = "testtt2" 
 
} 
 

 
text.innerHTML = isPrime(6);
<div onclick="test()" style="cursor:pointer; background-color:black; width:30px; height:30px"></div> 
 

 

 
<p id="text"></p> 
 

 
<div onclick="test2()" style="cursor:pointer; background-color:black; width:30px; height:30px"></div>
당신은 VAR의가 null의 원래 값으로 유지 그들이 다시 사용되지 않습니다 함수에서이 없기 때문에 문서가 그 당시에 존재하지 않았다면, 페이지가 모두로드 될 때 전역 변수에 대한 호출이 null 인 함수에 대한 액세스입니다. 이 코드는 이전에 text = document.getElementById('text')이 함수에있을 때만 작동했습니다.

+1

onload 후 버튼을 조작하기 위해 "No wrap - in "을 사용했습니다. "No wrap - in "는 실제 HTML 페이지를 대표하고 있습니까? – MCBlastoise

+0

머리 대 신체의 차이점에 대한 자세한 내용은 http://stackoverflow.com/questions/436411/where-should-i-put-script-tags-in-html-markup/24070373#24070373 –

+0

감사합니다. 이것은 내가 필요한 것입니다. – MCBlastoise