2012-06-16 16 views
6

Sto imparando javascript. So che possiamo passare una funzione ad altre funzioni dopo che la funzione è stata definita. Ma ho bisogno di aiuto per capire questo esempio:javascript: Passing functions

function map(func, array) { 
    var result = []; 
    forEach(array, function (element) { 
    result.push(func(element)); 
    }); 
    return result; 
} 

Da quello che posso capire, func è un argomento di mappa. Devo fornire una funzione come func. Ma nel tutorial che sto leggendo, non menziona da dove viene questa funzione, non sembra necessario specificare questo argomento? Un altro esempio nel tutorial è lo stesso:

function count(test, array) { 
    return reduce(function(total, element) { 
    return total + (test(element) ? 1 : 0); 
    }, 0, array); 
} 

Questa funzione di test è uguale all'elemento === 0? 1: 0, ma il tutorial non dice che ho bisogno di annotare la funzione di test. Devo scrivere questa funzione di test?

+0

Dove sono il tutorial? –

+0

Forse è [w3schools] (http://www.w3schools.com/). –

+0

http://eloquentjavascript.net/chapter6.html#p31aabc64 – Jenny

risposta

4

EDIT: Nel link al tutorial che hai postato, la funzione passata è una funzione predefinita Math.round. Il mio esempio qui sotto mostra la creazione della propria funzione da passare.


L'esempio map mostra l'implementazione. Fornirai la funzione (e la matrice) quando chiami map.

Dal suo aspetto, lo map passa l'elemento corrente nella matrice alla funzione, e la funzione dovrebbe fare qualcosa con esso e restituire il risultato. I risultati restituiti dalla funzione vengono aggiunti alla nuova matrice.

var arr = [1,2,3,4,5]; 
var my_func = function(item) { return item * 2; }; 

var new_arr = map(my_func, arr); 

console.log(new_arr); // [2,4,6,8,10] 
  1. abbiamo creato un array (arr),

  2. abbiamo creato una funzione (my_func), che prende qualunque ha dato, e moltiplica per 2.

  3. abbiamo passato entrambi a map

  4. la funzione map itera il nostro arr, passando l'elemento corrente in ogni iterazione alla nostra funzione.

  5. nostra funzione prende l'elemento corrente e restituisce il risultato della moltiplicazione per 2.

  6. la funzione map prende quel risultato, e lo aggiunge al nuovo array.

  7. quando l'iterazione è terminata, la funzione map restituisce la nuova matrice.

+0

Grazie per l'aiuto. Dopo aver letto la tua risposta, ho appena capito che l'uguaglianza è il test di funzionalità. – Jenny

0

Quando si chiama la mappa, si passa una funzione inline o una funzione esistente.

// The following would return [2,3,4] 
map(function(item) { return item + 1}, [1,2,3]); 

function double(item) {return item*2} 
map(double, [1,2,3]) 
// returns [2,4,6] 

// Your example, Math.round 
map(Math.round, [0.01, 2, 9.89, Math.PI]) 
// returns [0,2,10,3] 

Un altro modo per dirlo è che una funzione può essere passata a un'altra funzione come qualsiasi altro argomento.Questo è sulla stessa linea che una funzione è come qualsiasi altra variabile può essere passata o restituita da una funzione

function createAdder(toAdd) { 
    return function (num) { 
     return num + toAdd; 
    } 
} 

var add5 = createAdder(5); 
add5(2); // returns 7 


var add7 = createAdder(7); 
add7(-2); // returns 5