2016-08-06 4 views
-2

일종의 쉬운 것. "console.log ("test ", nn)})"행이 왜 값 3이 아닌 정의되지 않은 행으로 표시되는지 설명하는 데 도움을 줄 수 있습니까? 고맙습니다. 다음은 코드 스 니펫입니다.자바 스크립트 '정의되지 않음'

function unless(test, then) { 
    if (!test) then(); 
} 
function repeat(times, body) { 
    for (var i = 0; i < times; i++) body(i); 
} 

repeat(3, function(n) { 
    var nn = unless(n % 2, function() { 
    return 1 * 3 
    }); 
    console.log("test", nn) 
}); 
+4

'unless()'는 아무것도 반환하지 않는다. . – JJJ

+1

@Juhana 댓글은 답변이어야합니다. – Siguza

+1

이 질문은 답변 대신 닫아야합니다. – JJJ

답변

1

귀하 unless() 함수가 아무 것도 반환하지 않습니다. 따라서

var nn = unless(...); 

nn 그냥 undefined된다는 것을 의미합니다. nn에 값이 있으면 unless() 함수가 값을 반환해야합니다. 여기에서

:

function unless(test, then) { 
    if (!test) then(); 
} 

는 더 return 문이 없습니다. 콜백 then()은 값을 반환 할 수 있지만 값을 할당 한 경우 해당 값을 unless() 내에서 사용할 수 있습니다. unless() 자체가 값을 반환하도록하려면 하나 이상의 적절한 return 문을 추가해야합니다. 당신은 여전히 ​​test가 truthy 인 경우의 반환 값을 필요

function unless(test, then) { 
    if (!test) return then(); 
} 

그러나 :

예를 들어, 당신은 단지 등의 then() 값을 반환하여 문제의 일부를 해결할 수 있습니다. 당신이 무엇을 추천해야할지 모르겠다. 그래서 무엇을 추천해야할지 모르겠다. 일반적인 형태는 다음과 같다 :

function unless(test, then) { 
    if (!test) { 
     return then(); 
    } else { 
     return somethingelse; // assign some return value when `test` is truthy 
    } 
} 
+0

도움을 주셔서 감사합니다. 감사합니다. 이것은 매우 도움이된다. –

1

당신은 기능 unless 현재 unless() 반환 undefined의 결과에서 윈를 할당하려고하는, 따라서 식의 결과는 undefined입니다.

콜백 함수 then()의 반환은 var nn가 반환되는 때문에 아무것도 정의되지 않은 얻을 것을 의미, 더 return 문이없는 unless()의 범위에 반환 결과를 캡처 nn의 범위에 있지 않습니다. 당신이 당신의 알고리즘의 재귀 부분을 수행 할 때이 문제를 해결하기 위해

, 당신은 unless()의 범위에 변수에 할당해야하고 그 반환 :

function unless(test, then) { 
    var result = test; 
    if (!test) { 
     result = then(); 
    } 
    return result; 
} 
function repeat(times, body) { 
    for (var i = 0; i < times; i++) body(i); 
} 

repeat(3, function(n) { 
    var nn = unless(n % 2, function() { 
    return 1 * 3 
    }); 
    console.log("test", nn) 
}); 

이제 반환 3, 1, 3

+1

@ ZakariaAcharki 차이는 없습니다. – Siguza

+1

@ZakariaAcharki 나를위한 JavaScript가 아닙니다. 당신은 함수에 "nothing"을 넘겨주고, 그것을 undefined와 비교하여 "nothing"이'undefined '라고 주장 할 수 있습니다. (function (arg) {console.log (arg === undefined)})() ', 그리고 그것은 '사실'을 산출한다. 따라서 "아무것도"는 '정의되지 않음'과 같습니다. – Siguza

+0

@Siguza는 내 대답을 수정했습니다. 당신이 말한 것처럼 진정으로 정의되지 않은 것은 유효한 지적입니다. '정의되지 않은'경우를 우아하게 처리하는 것이 항상 최선이지만 – Alex

관련 문제