Разница между ссылкой на функцию и ее вызовом ( this.myFunc vs this.myFunc() )

может кто-нибудь объяснить разницу между вызовом метода (exp: this.myFunction()) и обращением к методу (exp: this.myFunction)

Вы уже записали разницу в своем вопросе... Один называет это, другой ссылается на это.

MauriceNino 22.05.2019 10:55

this.myFunction может быть назначена переменной (передана в func , переназначена и т. д.)

Panos K 22.05.2019 11:09
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
1
2
119
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Разница такая же, как разница между городом (в вашем случае вызовом функции) и знаком, указывающим на этот город (ссылаясь на функцию)

myFunc() выполняет функцию. myFunc — указатель на эту функцию

Ответ принят как подходящий

Хотя ответ @Cid абсолютно правильный, я подумал о том, чтобы добавить еще несколько деталей.


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

const increment = number => number + 1;

Здесь increment — это привязка к (анонимной, например, лямбда) функции, которая принимает значение и добавляет к нему 1.

Да, хорошо. Я уже знал это

Чего вы могли не знать: в JavaScript функции — это «первоклассные объекты». Это означает, что можно передавать функцию, как и любую другую переменную. Например, можно передать функцию как аргумент другой функции. Учтите Array.prototype.map.

let numbers = [1, 2, 3];

numbers.map(increment); // -> [2, 3, 4]

Чтобы проиллюстрировать это более подробно, вот реализация функции map, которая не полагается на Array.prototype.map, а имитирует ее:

const map = (funcReference, arrayOfXs) => {
  const result = [];
  for (let i = 0; i < arrayOfXs.length; i += 1) {
    result.push(funcReference(arrayOfXs[i]));
  }
  return result;
}

Примечание. Полностью эквивалентный map должен передать текущую позицию индекса в качестве второго, а полный массив в качестве третьего параметра в funcReference.

Если мы перепишем с ним пример Array.prototype.map, код станет таким:

map(increment, numbers); // -> [2, 3, 4]

хорошо, но это не ответ на мой вопрос

Мы приближаемся к этому. Давайте разберем map, чтобы понять, что происходит.

Первое, что следует здесь отметить, это то, что map принимает ссылку на функцию в качестве первого аргумента (точно так же, как Array.prototype.map), но это всего лишь указатель для функции, которую нужно вызвать/выполнить/применить, поэтому функция не вызывается в этот момент.

const map = (funcReference, arrayOfXs) =>
//           ^^^^^^^^^^^^^
//           points to increment

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

Выполнение происходит в этой строке:

result.push(funcReference(arrayOfXs[i]));
//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^
//               execute increment

Что все это означает в бетоне? Это означает, что интерпретатор понимает, что каждый раз, когда он видит funcReference внутри map, он может заменить его на increment. Он интерпретирует вызов map(increment, numbers)как будто, который вы написали:

const result = [];
for (let i = 0; i < numbers.length; i += 1) {
  result.push(increment(numbers[i]));
}

Если мы избавимся от петли for, она станет:

const result = [];
result.push(increment(1));
result.push(increment(2));
result.push(increment(3));

Что мы можем еще больше упростить:

const result = [];
result.push(1 + 1);
result.push(2 + 1);
result.push(3 + 1);

Надеюсь, это немного проясняет ситуацию.


Дополнительные сведения о функциях см. на этих страницах MDN:

большое спасибо за ответ, это было действительно полезно.

Wael Fadhel 22.05.2019 14:44

@WaelFadhel Нет проблем, рад, что это помогло. :)

David 22.05.2019 16:31

Другие вопросы по теме