2017-05-15 1 views
-1

그래서 함수형 프로그래밍과 고차 함수를 구체적으로 이해하려고합니다. 필자가 명확히 이해하지 못했던 것은 콜백 함수의 매개 변수가 배열과 어떻게 연결되어 있었는지였습니다.콜백 함수의 매개 변수는 어떻게 작동합니까?

더 명확하게하기 위해,이 코드 예제를 보자 :

var friends = ["Mike", "Stacy", "Andy", "Rick"]; 

friends.forEach(function (eachName, index){ 
console.log(index + 1 + ". " + eachName); // 1. Mike, 2. Stacy, 3. Andy, 4. Rick 
}); 

콜백 매개 변수 eachName 그것이 배열에서 항목을 반환하는 것을 의미하고 index이 배열의 인덱스를 반환하도록되어 있음을 알고 있는가? 어떻게 배열과 콜백 매개 변수 사이의 연결이 작동합니까?

+2

'forEach'가' "마이크"를 전달하는 콜백 함수를 호출, 0' 등 인수 ... 같은 – deceze

+0

'forEach'는 함수형 프로그래밍과는 아무 상관이 없습니다. 사용하지 마십시오. – Bergi

+1

@Bergi'map'은 어떨까요? – Limpuls

답변

2

forEach 메서드가 콜백 함수를 호출하거나 호출하는 중입니다. 보다 구체적으로 forEach가 어떻게 작동하는지 봅시다.

function forEach(arr, func) { 
    for (var i = 0; i < arr.length; i++) { 
    func(arr[i], i); 
    } 
} 

이제 이와 같은 작업을 수행 할 수 있습니다.

function forEach(arr, func) { 
 
    for (var i = 0; i < arr.length; i++) { 
 
    func(arr[i], i); 
 
    } 
 
} 
 

 
var cars = ["BMW", "Tata Nano", "Lamborghini"]; 
 

 
forEach(cars, function (car, index) { 
 
    alert(car + " " + index); 
 
});

+3

[for..in을 사용하여 배열을 반복하는 것에 대한주의 사항 삽입] – deceze

+0

array는 기본적으로 모든 인덱스가 숫자에 따라 저장되는 객체이기 때문에 배열의 in 루프에도 사용할 수 있습니다. –

+2

그래, 알았어, 실제주의 사항을 삽입하겠다 : [왜 "for ... in"을 배열 반복과 함께 사용 하는가?] (http://stackoverflow.com/q/500504/476) – deceze

0

API가 지원합니다. 이 경우 array.forEach의 콜백은 항상 현재 항목, 배열의 현재 항목 인덱스 및 배열 자체라는 3 개의 인수를 허용하도록 설정됩니다.

다른 인수 서명이있는 API의 한 예는 array.reduce입니다. 누적 기, 현재 항목, 현재 항목의 색인 및 배열 자체의 4 가지 인수를 허용하도록 설정됩니다.

+0

아, 그렇게 설계된 API라는 것을 전혀 알지 못했습니다. 원하는 매개 변수를 던질 수 있다고 생각했는데 그 이유는 그 이후에 어떻게 작동하는지 궁금해하고 있었기 때문입니다. 그러나 3 개의 인수를 취하도록 프로그래밍되어 있고 그 인수가 고정되어 있다면 이는 의미가 있습니다. 이것에 대한 더 자세한 정보를 원하면 저를 기사 나 뭔가에 링크시킬 수 있습니까? 감사! – Limpuls

+1

@Limpuls MDN은 훌륭한 자료입니다. 표준 함수 규칙이 적용됩니다. 예를 들어,'function.bind'는 컨텍스트를 변경하고 고정 된 인수를 앞에 붙일 수 있습니다. 화살표 기능은 또한 "이 덜"성격을 적용합니다. – Joseph

+0

그래서 우리가 만든 맞춤형 고차 함수를 사용하고 싶다면'forEach'와 같은 내장형 함수를 사용하면 얼마나 많은 매개 변수를 가질 수 있고 어떤 매개 변수가 될지 결정할 수 있습니다 (이전 게시물에서 말한 것처럼) 그것들을 고정시키고, 첫 번째 인자가 누산기, 두번째 currentIndex 등등)'.bind'를 사용하여 고정시킬 것인가? – Limpuls

관련 문제