Funkcje wyższego rzędu - prośba o wytłumaczenie

0
function forEach(array, action) {
  for (var i = 0; i < array.length; i++)
    action(array[i]);
}
function reduce(combine, base, array) {
  forEach(array, function (element) {
    base = combine(base, element);
  });
  return base;
}
function map(func, array) {
  var result = [];
  forEach(array, function (element) {
    result.push(func(element));
  });
  return result;
}

var op = {
  "+": function(a, b){return a + b;},
  "==": function(a, b){return a == b;},
  "===": function(a, b){return a === b;},
  "!": function(a){return !a;}
};

function asArray(quasiArray, start) {
  var result = [];
  for (var i = (start || 0); i < quasiArray.length; i++)
    result.push(quasiArray[i]);
  return result;
}

function partial(func) {
  var fixedArgs = asArray(arguments, 1);
  return function() {
    return func.apply(null, fixedArgs.concat(asArray(arguments)));
  };
}



function square(x) {return x * x;}
map(partial(map, square), [[10, 100], [12, 16], [0, 1]]);

Wszystko rozumiem, wszystko :) nawet prawie kumam funkcję partial :)

ale za diabła nie rozumiem jakim cudem można było przekazać funkcję square w tym miejscu :(
czy może ktoś mi to wyjaśnij - poproszę

0

Funkcje w javascript to tzw. obiekty pierwszej klasy (ale to brzmi) z ang. first class objects. Oznacza to, że możesz sobie je normalnie przekazywać, zwracać. Do momentu aż nie postawisz obok zmiennej trzymającej funkcję () to nie zostanie ona wywołana.

function fun() {
    alert("Callback, yeye!");
}

fun(); // alert("Callback, yeye!");

// ale można też tak

setTimeout(fun, 5000);

// za 5 sekund
// alert("Callback, yeye!");

// Gdybyś zrobił tak setTimeout(fun(), 5000); to wywoła się od razu

// Można sobie wyobrazić implementację setTimeout jako
function setTimeout(callback, timeout) {
    // w jakiś magiczny sposób odliczamy 5 sekund
    callback(); //wywołujemy wcześniej przekazaną funkcję dostawiająć nawiasy
}

W twoim kodzie dzieje się to samo, tylko w bardziej zagmatwany sposób :)

0

Ja rozumiem, że funkcję można przekazywać jako argumenty do funkcji. Chodziło mi tylko o to, że funkcja została wrzucona do argumentów, które później zostały zamienione na tablice i to jeszcze zostało zmiksowane - masakra !! :( nigdy się nie na uczę programować :(

0

Z takim podejściem masz rację. Z tego co wiem to ten kod ma Ci zwrócić tablicę podniesioną do kwadratu. Bardziej już tego nie można było skomplikować ;)

@zulik dopisz sobie w każdej funkcji gdzieś na początku debugger; otwórz narzędzia deweloperskie i otwórz plik z kodem. Teraz klikaj strzałkę i jak najedziesz na jakąś zmienną to pokaże Ci sie co tam jest. Poza tym zobaczysz dokładnie w jakiej kolejności jest wykonywany program.

0

To jest przykład z książki
shebang.pl/kursy/wszystko-jasne/

myślałem, że tak się programuje na "wysokim poziomie" i bałem się, że nie jestem wstanie tego skumać ;/

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.