[javascript] ‘반품’키워드는 어떤 유형입니까?

JavaScript 함수에서 선택적으로 return 문을 사용 합니다. 키워드입니다. 그러나 실제 유형은 무엇입니까 return? 실제로 나는 예제를 보면서 혼란스러워했습니다.

function add(a, b) {
  return (
    console.log(a + b),
    console.log(arguments)
  );
}

add(2, 2);

산출:

4
[2, 2]

따라서 쉼표로 구분 된 표현식을 return명령문에 전달할 수 있습니다 . 기능인가요?

그리고 이것부터 시작하여 JavaScript의 모든 키워드가 궁극적으로 함수라는 것을 추측 할 수 있습니까?

이 토론의 요점으로 작은 블로그를 작성했습니다. 여기 에서 확인할 수 있습니다 .



답변

그러나 ‘반품’자체의 실제 유형은 무엇입니까?

유형이없고 값이 아닙니다.

시도 typeof return;하면 얻을 수 있습니다 Unexpected token return.

따라서 쉼표로 구분 된 표현식을 return 문에 전달할 수 있습니다. 기능인가요?

아니요, 괄호 사용하여 함수를 호출 할 수 있지만 여기서는 쉼표 연산자로 구분 된 몇 가지 표현식을 포함하는 그룹화 연산자 입니다.

더 유용한 데모는 다음과 같습니다.

function add(a, b) {
  return (
    (a + b),
    (a - b)
  );
}

console.log(add(2, 2));

어떤 출력 0결과 때문에 a + b무시된다 (이것은 콤마 연산자의 LHS에) 및 a - b반환된다.


답변

여기에 아무도 사양을 직접 참조하지 않았다는 사실에 다소 충격을 받았습니다 .

12.9 return 문 구문 ReturnStatement : return; return [여기에 LineTerminator 없음] Expression;

의미론

ECMAScript 프로그램은 FunctionBody 내에없는 return 문이 포함 된 경우 구문 적으로 잘못된 것으로 간주됩니다. return 문은 함수가 실행을 중단하고 호출자에게 값을 반환하도록합니다. Expression을 생략하면 반환 값이 정의되지 않습니다. 그렇지 않으면 반환 값은 Expression의 값입니다.

ReturnStatement는 다음과 같이 평가됩니다.

Expression이 없으면을 반환 (return, undefined, empty)합니다. 보자 exprRef식의 평가의 결과. 반환 (return, GetValue(exprRef), empty).

따라서 사양으로 인해 예제는 다음과 같습니다.

return ( GetValue(exprRef) )

어디
exprRef = console.log(a + b), console.log(arguments)

쉼표 연산자사양에 따르면 …

의미론

프로덕션 Expression : Expression, AssignmentExpression은 다음과 같이 평가됩니다.

Let lref be the result of evaluating Expression.
Call GetValue(lref).
Let rref be the result of evaluating AssignmentExpression.
Return GetValue(rref).

… 모든 표현식이 쉼표 목록의 마지막 항목까지 평가되어 할당 표현식이됨을 의미합니다. 그래서 당신의 코드 return (console.log(a + b) , console.log(arguments))

1.) 결과 인쇄 a + b

2.) 실행할 것이 남아 있지 않으므로 다음 표현식을 실행하십시오.

3.)를 인쇄하고 return 문을 지정하지 않기 arguments때문에console.log()

4.) 정의되지 않은 것으로 평가

5.) 그런 다음 호출자에게 반환됩니다.

따라서 정답은 return유형이 없으며 일부 표현식의 결과 만 반환한다는 것입니다.

다음 질문 :

따라서 쉼표로 구분 된 표현식을 return 문에 전달할 수 있습니다. 기능인가요?

아니요. JavaScript의 쉼표는 여러 표현식을 한 줄로 결합 할 수 있도록 정의 된 연산자이며 목록에서 마지막에있는 항목의 평가 된 표현식을 반환하도록 사양에 의해 정의됩니다.

아직도 날 믿지 않나요?

<script>
alert(foo());
function foo(){
    var foo = undefined + undefined;
    console.log(foo);
    return undefined, console.log(1), 4;
}
</script>

여기 에서 해당 코드로 재생 하고 목록의 마지막 값을 엉망으로 만듭니다. 항상 목록의 마지막 값을 반환합니다. 귀하의 경우에는undefined.

마지막 질문은

그리고 이것부터 시작하여 JavaScript의 모든 키워드가 궁극적으로 함수라는 것을 추측 할 수 있습니까?

다시 말하지만. 함수는 언어에서 매우 구체적인 정의 를 가지고 있습니다. 이 답변은 이미 매우 길어지고 있으므로 여기서 다시 인쇄하지 않겠습니다.


답변

괄호로 묶인 값을 반환 할 때 어떤 일이 발생하는지 테스트 :

function foo() {
    return (1, 2);
}

console.log(foo());

답을 제공 2하므로 쉼표로 구분 된 값 목록이 목록의 마지막 요소로 평가되는 것처럼 보입니다.

실제로 괄호는 여기서 관련이 없으며 함수 호출을 의미하는 대신 작업을 그룹화합니다. 그러나 놀라운 것은 여기서 쉼표가 합법적이라는 것입니다. 여기서 쉼표가 어떻게 처리되는지에 대한 흥미로운 블로그 게시물을 찾았습니다.

https://javascriptweblog.wordpress.com/2011/04/04/the-javascript-comma-operator/


답변

return함수가 아닙니다. 그것이 발생하는 기능 의 연속 입니다.

문 생각해 함수의 이름입니다. 평가할 때 . 따로 설정 한 부분을 공백으로 채울 수있는와 같이 시각화 할 수 있습니다 . 값이 무엇인지 알면 다시 선택합니다.alert (2 * foo(bar));foofoo(bar)alert (2 * _)foo(bar)

당신이 제쳐 둔 것은 전화 의 지속 이었다 foo(bar).

호출 return은 그 연속에 가치를 제공합니다.

내부 함수 를 평가할 때 foo나머지는 foo해당 함수가 값으로 줄어들기를 기다린 다음 foo다시 선택합니다. 을 (를) 평가할 목표가 아직 남아 있습니다 foo(bar). 일시 중지되었습니다.

return내부 를 평가할 때의 foo어떤 부분도 foo값 을 기다리지 않습니다 . 당신이 그것을 사용한 return장소의 가치로 감소하지 않습니다 foo. 대신 전체 호출 foo(bar) 이 값으로 줄어들고 “evaluate foo(bar)” 목표가 완료된 것으로 간주되어 사라집니다.

사람들은 일반적으로 프로그래밍을 처음 접할 때 연속성에 대해 이야기하지 않습니다. 그들은 거기에 그냥 있기 때문에, 고급 주제로 생각할 수 있습니다 사람들이 결국 몇 가지 아주 고급 일 연속성을 함께가. 그러나 진실은 함수를 호출 할 때마다 그것들을 모두 사용하고 있다는 것입니다.


답변

return여기에 붉은 청어입니다. 흥미로운 것은 다음과 같은 변형입니다.

function add(a, b) {
  return (
    console.log(a + b),
    console.log(arguments)
  );
}

console.log(add(2, 2));

마지막 줄로 출력되는

undefined

함수가 실제로 아무것도 반환하지 않기 때문입니다. (있는 console.log경우 두 번째 반환 값을 반환합니다 ).

그대로 코드는 정확히

function add(a, b) {
    console.log(a + b);
    console.log(arguments);
}

console.log(add(2, 2));


답변

return 문 을 이해하는 흥미로운 방법 은 void 연산자를 사용하는 것입니다.이 코드를 살펴보십시오.

var console = {
    log: function(s) {
      document.getElementById("console").innerHTML += s + "<br/>"
    }
}

function funReturnUndefined(x,y) {
   return ( void(x+y) );
}

function funReturnResult(x,y) {
   return ( (x+y) );
}

console.log( funReturnUndefined(2,3) );
console.log( funReturnResult(2,3) );
<div id="console" />

때문에 return문은 하나 개의 인수 소요 [[expression]]하고, 즉 스택에 호출자에게 반환이 arguments.callee.caller그 다음 실행할 void(expression)다음 반환 undefined무효 연산자의 평가입니다를.


답변