es6 Arrow Functions에서 언제`return`을 사용해야합니까?


답변:


262

Jackson은 이와 비슷한 질문에 부분적으로 답변했습니다 .

암시 적 반환 (블록이없는 경우에만).

  • 한 줄짜리가 여러 줄로 확장되고 프로그래머가을 추가하는 것을 잊었을 때 오류가 발생합니다 return.
  • 암시 적 반환은 구문 상 모호합니다. (name) => {id: name}객체를 반환합니다 {id: name}... 맞습니까? 잘못된. 를 반환합니다 undefined. 이 중괄호는 명시 적 블록입니다. id:라벨입니다.

여기에 블록 정의를 추가합니다 .

블록 문 (또는 다른 언어의 복합 문)은 0 개 이상의 문을 그룹화하는 데 사용됩니다. 블록은 한 쌍의 중괄호로 구분됩니다.

:

// returns: undefined
// explanation: an empty block with an implicit return
((name) => {})() 

// returns: 'Hi Jess'
// explanation: no block means implicit return
((name) => 'Hi ' + name)('Jess')

// returns: undefined
// explanation: explicit return required inside block, but is missing.
((name) => {'Hi ' + name})('Jess')

// returns: 'Hi Jess'
// explanation: explicit return in block exists
((name) => {return 'Hi ' + name})('Jess') 

// returns: undefined
// explanation: a block containing a single label. No explicit return.
// more: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label
((name) => {id: name})('Jess') 

// returns: {id: 'Jess'}
// explanation: implicit return of expression ( ) which evaluates to an object
((name) => ({id: name}))('Jess') 

// returns: {id: 'Jess'}
// explanation: explicit return inside block returns object
((name) => {return {id: name}})('Jess') 

나는 그 구문을 얻지 못한다.. 클래스 littoral을 사용하여 클래스를 만든 다음 하나의 인수 ( 'Jess')로 묵시 생성자를 호출하고 있습니까? 나는 당신이 ((name) => ({id : 'Jess'})) 할 것이라고 생각했습니다
Michael Dausmann

3
@MichaelDausmann name함수는 괄호로 묶여 있고 하나의 인수 "Jess"로 호출되는 매개 변수가 하나 인 화살표 함수입니다 . =>와 사이의 코드 )('Jess')는 화살표 기능의 본문입니다. 이를 즉시 호출 된 함수 표현의 짧은 형식으로 생각하십시오(function (name) { return { id: name } })('Jess')
Russ Cam

매우 유용한 indded! Promises.all에서 화살표 함수가있는 항목을 매핑하는 문제를 발견하는 데 도움이되며 화살표 함수가있는 배열에 매핑하는 데 값이 반환되지 않은 경우 정의되지 않은 배열을 얻는 지 알 수 있습니다.
jay shah 2016 년

화살표 함수에 대한 암시 적 반환을 체계적으로 만드는 단점은 무엇입니까? 그냥 같은 커피 스크립트는 않습니다 ... (내가하지 커피 스크립트처럼 할지라도)
아우구스틴 Riedinger에게

4
분명히, JS 파서는 표현식 (예 : 객체 리터럴을 포함하는 표현식 {}) 또는 블록 을 기대할지 모르기 때문에 a가 블록을{ } 나타내는 것으로 가정합니다 . 이 볼 때 그 수단 id: name,이 생각은 id:생성 식이다 라벨 (흐름 제어를 사용하는 다루고 있음 JS 아주 드물게 사용되는 기능 :하고) name다음은 id:단지 변수를 포함하는 별도의 문이 단순히를 name( 아무것도하지 않습니다).
iono

18

이 엄지 손가락 규칙을 이해합니다 ...

효과적으로 변형되는 함수 (한 줄의 인수 조작)의 경우 반환이 암시 적입니다.

후보자는 다음과 같습니다.

// square-root 
value => Math.sqrt(value)

// sum
(a,b) => a+b

다른 작업 (블록이 필요한 라이너가 두 개 이상인 경우 반환은 명시 적이어야 함)


11

또 다른 경우가 있습니다.

React에서 기능 컴포넌트를 작성할 때 괄호를 사용하여 내재적으로 리턴 된 JSX를 랩핑 할 수 있습니다.

const FunctionalComponent = () => (
  <div>
    <OtherComponent />
  </div>
);

4
항상 괄호를 사용할 수 있으며 JSX 또는 React 와 관련 이 없습니다.
Emile Bergeron

4

나에게 약간의 문제가 발생한 또 다른 사례가 있습니다.

// the "tricky" way
const wrap = (foo) => (bar) => {
  if (foo === 'foo') return foo + ' ' + bar;
  return 'nofoo ' + bar;
}

여기서 "tricky"비트는 외부 함수 ((bar) => ...로 시작하는 부분)의 함수 본문이 시각적으로 "block"처럼 보이지만 그렇지 않다는 것입니다. 그것이 아니기 때문에, 암시 적 귀환은 시작됩니다.

다음은 랩이 실행되는 방법입니다.

// use wrap() to create a function withfoo()
const withfoo = wrap('foo');
// returns: foo bar
console.log(withfoo('bar'));

// use wrap() to create a function withoutfoo()
const withoutfoo = wrap('bar');
// returns: nofoo bar
console.log(withoutfoo('bar'));

내가 이것을 풀고 그 방법을 기능화하기 위해 이해했다.

다음은 첫 번째 코드 블록과 의미가 동일하며 wrap () 본문을 명시 적으로 반환하도록합니다. 이 정의는 위와 동일한 결과를 생성합니다. 이것은 점들이 연결되는 곳입니다. 위의 첫 번째 코드 블록을 아래의 코드 블록과 비교하면 화살표 함수 자체가 블록이 아닌 표현식으로 취급되며 암시적인 return이 있음이 분명합니다 .

// the explicit return way
const wrap = (foo) => {
  return (bar) => {
    if (foo === 'foo') return foo + ' ' + bar;
    return 'nofoo ' + bar;
  }
}

완전 화살표 화되지 않은 랩 버전은 다음과 같으며, 지방 화살표 버전만큼 컴팩트하지는 않지만 이해하기가 훨씬 쉽습니다.

// the "no arrow functions" way
const wrap = function(foo) {
  return function(bar) {
    if (foo === 'foo') return foo + ' ' + bar;
    return 'nofoo ' + bar;
  };
};

결국, 내 코드를 읽어야 할 미래의 사람들을 위해, 나는 화살표가 아닌 화살표 버전이 아닌 언뜻보기에 시각적으로 이해할 수있는 비 화살표 버전을 선호한다고 생각합니다. 생각 (그리고 내 경우 실험) grok.


3

화살표 함수를 사용하면 암시 적 반환을 할 수 있습니다. return키워드 를 사용하지 않고도 값이 반환됩니다 .

함수 본문에 온라인 문장이있을 때 작동합니다.

const myFunction = () => 'test'

console.log(myFunction()) //'test'

또 다른 예는 객체를 반환하는 것입니다 (래핑 괄호 본문 괄호로 간주되지 않도록 중괄호를 괄호로 묶어야합니다).

const myFunction = () => ({value: 'test'})

console.log(myFunction()) //{value: 'test'}


1
조금 더 설명이 필요하지만 정답이어야합니다. 기본적으로 함수 본문이 블록이 아닌 표현식 인 경우 해당 표현식의 값이 내재적으로 리턴됩니다. 틀 렸으면 말해줘.
Paul-Sebastian Manole
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.