С 5 точки можем да видим как функциите са само обекти вътрешно в JavaScript.

Функциите са обекти в JavaScript. Можем да ги предаваме като обекти, като съдържащи данни. Освен че изпълняват операции като функция, те се съхраняват вътрешно като данни.

Функция в JavaScript е обект, защото,

  1. Функциите съдържат свойства като обекти
  2. Можем да добавим нови свойства или да прочетем свойствата
  3. Можем да предадем функция на друга функция заедно с нейните свойства и данни
  4. Можем да върнем функция заедно с нейните свойства и данни
  5. Той принадлежи към веригата прототипи на JavaScript

Приказките са евтини, покажете ми вашия код

Нека видим тези твърдения в действие,

Функциите съдържат свойство

Можем да получим име на функция точно като свойствата на обекта,

function getBestRockBandInBd() {
  return 'Warfaze'; 
}
console.log(getBestRockBandInBd.name); // getBestRockBandInBd

Тук виждаме, че когато създаваме функция, тя има свойството name, което може да бъде отпечатано точно като свойствата на обекта.

Когато създаваме функция, тя вътрешно създава обект със следните свойства,

  • Код (Можем да ги извикаме с помощта на functionName())
  • име (запазено името на функцията, неприложимо за функциите със стрелки)

Можем да добавим нови свойства или да прочетем свойствата

Можем да използваме функцията, за да съхраняваме собственост и да я извличаме по-късно,

function bestPsychedelicRockBandInBd() {
  return 'Sonar Bangla Circus';
}
bestPsychedelicRockBand.foo = 'bar';
console.log(bestPsychedelicRockBand.foo); // bar

Тук задаваме свойство foo на функцията bestPsychedelicRockBand и по-късно го отпечатваме в конзолата.

Можем да предадем функция на друга функция заедно с нейните свойства и данни

Нека да предадем функция на друга функция и да извършим изпълнението,

function nemesis(whoIsVocal) {
  console.log(whoIsVocal()); // `whoIsVocal` function comes as parameter
}
// We will pass this function to `nemesis` function as parameter
function showVocalName() {
  console.log('Zohad');
}
nemesis(showVocalName);

Можем да върнем функция заедно с нейните свойства и данни

Сега като обект, ще върнем функция от друга функция,

function anotherRockBand() {
  // We are returning function named `aurthohin`
  return function aurthohin() {
    console.log('This is Aurthohin');
  }
}
const returnedFunction = anotherRockBand();
returnedFunction();

Тази функция засилва функцията JavaScript closure.

Той принадлежи към веригата прототипи на JavaScript

Знаем, че основният обект Object има свойство, наречено prototype,

console.log(Object.hasOwnProperty('prototype')); // true

Ако създадем функция, можем да видим, че функцията също има свойството prototype,

function crypticFate() {}
console.log(crypticFate.hasOwnProperty('prototype')); // true

Можем да извикаме функция с помощта на call, bind и apply. Интересното е, че те не са собствено свойство на функцията, можем да проверим това,

function crypticFate() {}
console.log(crypticFate.hasOwnProperty('call'));  // false
console.log(crypticFate.hasOwnProperty('bind'));  // false
console.log(crypticFate.hasOwnProperty('apply'));  // false

Всъщност тези свойства са наследени от веригата на прототипа и естествени за основния обект. За да проверите,

function crypticFate() {}
console.log(crypticFate.__proto__.hasOwnProperty('call'));  // true
console.log(crypticFate.__proto__.hasOwnProperty('bind'));  // true
console.log(crypticFate.__proto__.hasOwnProperty('apply'));  // true

Последни мисли

Както виждаме тези 5 точки, споменати по-горе, функциите са просто обекти в света на JavaScript. Кажете ми вашите мисли по този въпрос.

Повече съдържание в PlainEnglish.io. Регистрирайте се за нашия безплатен седмичен бюлетин. Следвайте ни в Twitter, LinkedIn, YouTube и Discord . Интересувате ли се от Growth Hacking? Вижте Circuit.