2017-03-05 1 views
-1

이 질문은 여기에 몇 번 올랐지만 내 생각은 약간 다릅니다. JavaScript를 처음 접했을 때이 문제를 보여주는 기본 프로그램입니다.자바 스크립트 루틴에서 반환되는 여러 배열을 가져 오는 방법

var iterations = 0; 

function someFunc(x, y, z) { 

    for (var i=0; i<4; i++) { 
     x[i] = x[i] * 2; 
     y[i] = y[i] * 2; 
     z[i] = z[i] * 2; 
    } 

    iterations++; 

    if (iterations >= 10) 
     return {done:true, x, y, z}; 
    else 
     return {done:false, x, y, z}; 

} 

function main() { 

    var x = [0, 0, 0, 0]; 
    var y = [1, 1, 1, 1]; 
    var z = [2, 2, 2, 2]; 


    done = false; 
    while (!done) { 

     let {done, x, y, z} = someFunc(x, y, z); 
     console.log(x, y, z); 

     // Do some other stuff with x,y,z here, 
     // like calling anotherFunc(x, y, z) 

    } 
} 


main(); 

someFunc를 호출하면 오류가 발생합니다. 오류는 "Exception Occurred : 참조 오류 : x가 정의되지 않았습니다"입니다.

그래서 루프를 돌 때마다 배열을 업데이트하는 함수를 호출하고 있습니다. 그 배열을 'someFunc'라는 함수에서 빼낼 수 있어야합니다. 그래서 다른 함수에 전달하여 다른 작업을 수행 할 수 있어야합니다.

그런 다음 다시 끝내기까지 루프의 둘레와 주위를 다시 첫 번째 함수로 다시 피드해야합니다.

a, b, c = someFunc(a, b, c) 

잘처럼 내가 파이썬에서오고

어디를 호출합니다.

그러나 JavaScript로 진행하는 방법을 알지 못합니다. 어떤 도움이라도 대단히 감사 할 것입니다. 내 질문이 완전히 명확하지 않은 경우 명확히 밝혀야합니다.

+0

일단 vairable를 선언해야합니까? – Li357

+0

두 번째 함수에서'x, y, z' 변수를'var'으로 선언하여 함수에 범위를 지정하지만 첫 번째 함수에서는'x, y '를 선언 할 때'var'를 생략한다는 점에 유의해야합니다 , z' - 효과적으로 글로벌 범위로 캐스팅합니다. 이는 문제와 관련이 없을 수도 있지만, 전역 네임 스페이스에서 이들을 사용할 수있는 의도가 아니라면 첫 번째 함수에서 'var'접두사를 붙이는 것이 좋습니다. –

+0

@Andrew Li : SomeFunc에서 변경 되었기 때문에 값이 필요합니다. – davo36

답변

0

데이터 개체를 전달하면 반환 코드없이 개체 값을 변경할 수 있습니다.

var iterations = 0; 

function someFunc(obj) { 

    for (var i = 0; i < 4; i++) { 
     obj.x[i] = obj.x[i] * 2; 
     obj.y[i] = obj.y[i] * 2; 
     obj.z[i] = obj.z[i] * 2; 
    } 

    iterations++; 

    if (iterations >= 10) 
     obj.done = true; 
    else 
     obj.done = false; 

} 

function main() { 

    var objectOfData = { 
     x: [0, 0, 0, 0], 
     y: [1, 1, 1, 1], 
     z: [2, 2, 2, 2], 
     done: false, 
    }; 

    while (!objectOfData.done) { 

     someFunc(objectOfData); 
     console.log(JSON.stringify(objectOfData)); 
     // Using stringify, as console.log() is async 

     // Do some other stuff with x,y,z here, 
     // like calling anotherFunc(x, y, z) 

    } 
} 

또한, 당신은 왜 당신이 즉시 전달 된 인수를 재 할당하는 var, let, etc

+0

안녕하세요, 고마워,이 작품. – davo36

+0

@ davo36 오신 것을 환영합니다. –

0

함수의 값을 식별자로 설정 한 다음 소멸 할당을 사용하여 속성을 전역 적으로 설정하고 속성을 가져옵니다.

let props = someFunc(x, y, z); 
({done, x, y, z} = props); 
console.log(x, y, z); 
+0

참고 let으로 다시 선언하지 않으므로 범위가 차단되지 않으며 액세스하려고 할 때 초기화되지 않기 때문에이 방법이 유용합니다. 이렇게하면 기존 함수 유효 범위가 지정된 var 변수가 다시 할당됩니다. – Li357

+0

@AndrewLi OP는 변수를 다시 선언해서는 안됩니다. – niceman

+0

@niceman 왜 대답을했는지 그 이유와 이유를 지적했습니다. – Li357