Почему регистрация выражения функции выполняет функцию без вызова?

Эта функция

function mapForEach(arr, fn) {

  var newArr = [];
  for (var i = 0; i < arr.length; i++) {
    newArr.push(
      fn(arr[i])
    )
  };

  return newArr;
}

var arr1 = [1, 2, 3];

вызывается

mapForEach(arr1, function (item) {
  return item * 2;
}); // [2,4,6]

и не вызывается этим объявлением переменной

var arr2 = mapForEach(arr1, function (item) {
  return item * 2;
});

но вызывается при входе в консоль

console.log(arr2); // [2,4,6] in the console

почему вызов здесь не нужен?

console.log(arr2());

Я до сих пор не понимаю, чем это отличается от

function foo () { return 2 === 2 };

определение функции журналов

console.log(foo); // function foo() { return 2 === 2 } 

вызывается в функции журнала, записывает возвращаемое значение

console.log(foo()); // true

person nSideOut    schedule 12.02.2017    source источник
comment
Потому что он вызывается этим объявлением переменной. Почему вы думаете иначе? Вы просто присваиваете результат имени arr2. Если вы думали, что присваиваете функцию, то почему назвали ее массивом?   -  person jonrsharpe    schedule 13.02.2017
comment
Я не назвал его, я читаю его и пытаюсь научиться, процесс, который должен произойти, если вы не родились с идеальным знанием Javascript (я не был). Я думал, что присвоение возвращаемого значения не существует в памяти до выполнения, которое должно было произойти сейчас после объявления как arr2(), которое затем синхронно будет доступно ниже по строке при выполнении программы. Поэтому я ожидал, что console.log(arr2) зарегистрирует определение функции. К счастью, у нас есть такие вещи, как переполнение стека, где мы можем задавать вопросы, на которые у нас еще нет ответов, в отличие от вопросов, которые у нас есть...?   -  person nSideOut    schedule 13.02.2017
comment
Это не поможет вам быть язвительным. Вопрос, почему вы думаете иначе, является исследовательским, чтобы определить, в чем заключаются ваши неправильные представления, чтобы мы могли обратиться к ним напрямую, а не просто посоветовать вам прочитать книгу (в которой должны быть рассмотрены все ваши заблуждения, независимо от того, они есть, но они также почти бесполезны для конкретной проблемы, с которой вы столкнулись).   -  person Amadan    schedule 13.02.2017
comment
Я не отвечал на вопрос Почему вы думаете иначе, но Если вы думали, что присваиваете функцию, почему вы назвали ее массивом? Почему предполагается, что я назвал ее? Если бы я назвал его и, назвав его «массивом», подразумевал, что я знаю ответ на свой вопрос, зачем мне задавать свой вопрос? Я не хочу показаться саркастичным, я только что видел так много людей, которых здесь избивают за то, что они задают вопросы. Разве это не то, для чего это нужно? Когда я смогу отличить законный вопрос от неправомерного вопроса или вопрос, на который можно ответить в книге, от вопроса, на который может ответить человек, я так и сделаю.   -  person nSideOut    schedule 13.02.2017
comment
Вы назвали его var arr2 = ..., это то, что я имел в виду.   -  person jonrsharpe    schedule 13.02.2017


Ответы (1)


Я думаю, что здесь происходит просто небольшая путаница в поведении в консоли JavaScript или в возвращаемом значении из объявления var.

Консоль всегда будет отображать значение того, что вы вводите. возвращаемое значение вызова функции. Однако возвращаемое значение var равно undefined. Это означает, что в то время как mapForEach без присваивания будет отображать [2,4,6], функция действительно вызывается в обоих случаях, просто с var arr2 = то, что вы ожидали, не отображается.

См. этот вопрос, чтобы узнать больше о возвращаемом значении из объявления var.

person mikej    schedule 12.02.2017
comment
Небольшое исправление: возвращаемое значение присваивания undefined неверно (arr2 = [2, 4, 6] оценивается как [2, 4, 6]); возвращаемое значение оператора var undefined ближе к истине (var arr = [2, 4, 6] оценивается как undefined в консоли и даже не может быть lvalue в программе). - person Amadan; 13.02.2017
comment
Большое спасибо @Amadan - у меня было ощущение, что мой ответ не был точным, учитывая контексты, в которых можно использовать значение присваивания, однако я пытался объяснить на основе примеров из ОП. Обновлю ответ, чтобы уточнить! - person mikej; 13.02.2017