1

이 기술을 currying이라고합니다.anon 함수를 전달할 때 Error 속성이 정의되어 있지 않습니다 (카레 만드는 법)?

문제 :

https://repl.it/E4iG

ReferenceError: type is not defined 
    at hasType:14:27 
    at allApprovalTypes.map:18:26 
    at eval:17:21 
    at eval 

질문 : 가 어떻게 그렇게 결국 나는 approvals.find(hasType)에 이름이 지정되지 않은 익명의 기능을 대체 할 수 hasType를 사용합니까?

var approvals = [ 
     {type: 'media'}, 
     {type: 'scope'}, 
    ] 

    var allApprovalTypes = [ 
     'media', 
     'scope', 
     'finance', 
     'compliance', 
    ]; 

    var hasType = (el) => { 
     return el.type === type; 
    } 

    allApprovalTypes.map((type) => { 
     return approvals.find((el)=> el.type === type) || {type: type} // this works. 
    }); 

    allApprovalTypes.map((type) => { 
     return approvals.find(hasType) || {type: type} // this wont work.   
    }); 
+1

는 방법'hasType' 기능은'type' 변수를 알아? –

답변

2

hasType은 해당 범위에 존재하지 않는 "유형"변수를 참조합니다.

allApprovalTypes.map((type) => { 
    return approvals.find((el) => { 
     return el.type === type; 
    }) || {type: type} 
}); 


    // closure 
    var hasType = (type) => (el) => { 
     return el.type === type; 
    } 

P.S.를이 유형을 선택하는 당신은 그 함수를 인라인해야합니다 (또는 폐쇄에 포장,하지만 거의 같은 일이) - 관련이 없지만 ES6에서는 "{type : type}"을 "{type}"으로 축약 할 수 있습니다.

+0

hasType 작업을하기 위해 closure로 어떻게 포장합니까? 이 종결은 내가 성취하려는 것입니다. 나는 구문을 현명하게 잃어 버렸다. –

+1

"type"을 허용하지만 원래 버전의 hasType 함수를 반환하는 함수로 hasType을 변경하십시오. 그런 다음 .find (...)에 hasType (유형)을 통과 : var에 hasType = (유형) => { \t 리턴 (엘) => { \t \t 반환 el.type === 유형; \t}; }; ... allApprovalTypes.map (TYPE => { 복귀 approvals.find (hasType (식)) || {타입}} ); –

+0

ayeee thats 내가 찾고 있던 것이 었습니다. 이 기술은 바로 currying이라고 부릅니까? –

0

.bind()을 사용하면 가능합니다. 콜백에 type (추가 매개 변수)을 전달할 수 있습니다.

var approvals = [ 
 
     {type: 'media'}, 
 
     {type: 'scope'}, 
 
    ] 
 

 
    var allApprovalTypes = [ 
 
     'media', 
 
     'scope', 
 
     'finance', 
 
     'compliance', 
 
    ]; 
 

 
    var hasType = (el, type) => { 
 
     return el.type === type; 
 
    } 
 

 
    console.log(allApprovalTypes.map((type) => { 
 
     return approvals.find(hasType.bind(null, type)) || {type: type} // this works. 
 
    })); 
 

 
    
 

 
    //without bind(); 
 
    console.log(allApprovalTypes.map((type) => { 
 
     return approvals.find((el) => return hasType(el, type)) || {type: type} // this works. 
 
    }));

+0

아래의 답은 종결을 말합니다. 바인딩을 사용하여이 방법을 사용하는 방법에 대한 아이디어가 있습니까? –

+0

바인딩이 없다는 것은'익명 함수'(fat arrow 함수)에서'hasType()'을 호출하는 것을 의미합니다. 내가 업데이트했습니다 –

+1

내가 찾고 있던 var hasType = (type) => (el) => el.type === type; –

관련 문제