В JavaScript функции называются «объектами первого класса», потому что:

В JavaScript функции называются «объектами первого класса», потому что:

  • Функция — это экземпляр типа Object.
  • Функция может иметь свойства и иметь обратную ссылку на метод конструктора.
  • Вы можете сохранить функцию в переменной
  • Вы можете передать функцию в качестве параметра другой функции
  • Вы можете вернуть функцию из функции

Как вы думаете, что будет напечатано в следующем:

Анонимный обратный вызов, именованный обратный вызов

function foo(callback) {
    console.log('grape');
    callback();
}
function bar() {
    console.log('banana');
}
const fruitBasket = function() {
    console.log('apple');
    bar();
    foo(bar);
    foo(function() {
        console.log('orange');
    });
    console.log('pear');
};
fruitBasket();

Функция, которая принимает значение и два обратных вызова. Функция должна возвращать результат обратного вызова, который приводит к большему значению.

function greaterValue(value, cb1, cb2) {
    // compare cb1 invoked with value to cb2 invoked with value
    // return the greater result
let res1 = cb1(value);
    let res2 = cb2(value);
    if (res1 > res2) {
        // if this is false, we move out of if statement
        return res1;
    }
    return res2;
}
let negate = function(num) {
    return num * -1;
};
let addOne = function(num) {
    return num + 1;
};
console.log(greaterValue(3, negate, addOne));
console.log(greaterValue(-2, negate, addOne));

Примечание: мы не вызываем negate или addOne (используя для их вызова ()), мы передаем саму функцию.

Напишите функцию myMap, которая принимает в качестве аргументов массив и обратный вызов. Функция должна имитировать поведение Array.prototype.map.

function myMap(arr, callback) {
    // iterate through the array, perform the cb on each element
    // return a new array with those new values
    let mapped = [];
for (let i = 0; i < arr.length; i++) {
        // remember that map passes three args with each element.
        let val = callback(arr[i], i, arr);
        mapped.push(val);
    }
return mapped;
}
let double = function(num) {
    return num * 2;
};
console.log(myMap([1, 2, 3], double));

Напишите функцию myFilter, которая принимает в качестве аргументов массив и обратный вызов. Функция должна имитировать поведение Array.prototype.filter.

function myFilter(arr, callback) {
    let filtered = [];
for (let i = 0; i < arr.length; i++) {
        let element = arr[i];
if (callback(element, i, arr)) {
            filtered.push(element);
        }
    }
return filtered;
}

Напишите функцию myEvery, которая принимает массив и обратный вызов в качестве аргументов. Функция должна имитировать поведение Array.prototype.every.

function myEvery(arr, callback) {
    for (let i = 0; i < arr.length; i++) {
        let element = arr[i];
if (callback(element, i, arr) === false) {
            return false;
        }
    }
    return true;
}

Дополнительные примеры вышеуказанных концепций

const createMeowValue = () => {
  console.log(this.name);
  let meow = function () {
    console.log(this);
    console.log(this.name + ' meows');
  }
  meow = meow.bind(this);
  return meow;
};
const name = 'Fluffy';
const cat = {
  name: name,
  age: 12,
  createMeow: function () {
    console.log(this.name);
    let meow = () => {
      const hello = 'hello';
      console.log(this.name + ' meows');
    };
    let world = '';
    if (true) {
      world = 'world';
    }
    console.log(world);
    // meow = meow.bind(this);
    return meow;
  }
};
cat.newKey = function () {
  const outermostContext = this;
  const innerFunc = () => {
    secondContext = this;
    console.log(secondContext === outermostContext)
    return function () {
      innermostContext = this;
    }
  };
  return innerFunc.bind(outermostContext);
};
const meow = cat.createMeow(); // method-style invocation
meow(); // function-style invocation
console.log('-------')
const createMeow = cat.createMeow;
const globalMeow = createMeow(); // function-style
globalMeow(); // function-style
function createSmoothie(ingredient) {
  const ingredients = [ingredient];
  return ingredients;
}
// console.log(createSmoothie('banana'));
// console.log(createSmoothie('apple'));
// one parameter only
// first argument is a string
// return an array
// DO NOT USE forEach

Использованная литература: