В 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
Использованная литература: