【问题标题】:Why does logging a function expression execute the function with out invocation?为什么记录函数表达式会在没有调用的情况下执行函数?
【发布时间】:2017-06-30 20:45:01
【问题描述】:

这个功能

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

【问题讨论】:

  • 因为它由该变量声明调用的。为什么你不这么认为?您只是将结果分配给名称arr2。如果您认为您正在分配一个函数,为什么将其命名为数组?
  • 我没有命名它,我正在阅读它并尝试学习,除非您天生就精通 Javascript(我不是),否则这个过程必须发生。我认为返回值的分配在内存中不存在,直到执行,现在必须在声明为 arr2() 之后发生,然后在程序执行中同步可用。所以我期待 console.log(arr2) 记录一个函数定义。幸运的是,我们有诸如堆栈溢出之类的东西,我们可以在其中提出我们还没有答案的问题,而不是我们做的问题......?
  • 刻薄无助于你。 “你为什么不这样认为”的问题是探索性的,以确定你的误解在哪里,所以我们可以直接解决它们,而不是仅仅指给你看一本书(应该解决你的所有的误解,无论它们是什么,但对于您遇到的特定问题也几乎毫无用处)。
  • 我没有回复 “你为什么不这么认为” 而是 “如果你认为你正在分配一个函数,为什么你将它命名为一个数组? " 为什么假设我命名它?如果我给它命名,并且通过将它命名为“数组”暗示我知道我的问题的答案,我为什么要问我的问题?我并不是要刻薄,我只是看到有很多人在这里因为提问而受到抨击。这不就是为了这个吗?当我能区分合法问题与非法问题或适合一本书回答的问题和一个人回答的问题时,我会这样做。
  • 你确实把它命名为var arr2 = ...,这就是我所指的。

标签: javascript invocation


【解决方案1】:

我认为这里发生的只是对 JavaScript 控制台中的行为或 var 声明的返回值的轻微混淆。

控制台将始终显示您输入的内容的值。例如函数调用的返回值。 然而var 的返回值是undefined。这意味着虽然没有赋值的mapForEach 将显示[2,4,6],但在这两种情况下都确实调用了该函数,但只是使用var arr2 =,您所期望的东西不会显示。

有关var 声明返回值的更多背景信息,请参阅this question

【讨论】:

  • 轻微修正:“赋值的返回值为undefined”不正确(arr2 = [2, 4, 6] 计算为[2, 4, 6]); “var 语句的返回值是undefined”更接近事实(var arr = [2, 4, 6] 在控制台中计算为undefined,甚至不能是程序中的左值)。
  • 非常感谢@Amadan - 鉴于可以使用分配值的上下文,我感觉我的答案并不准确,但我试图根据 OP 中的示例进行解释。将更新答案澄清!
猜你喜欢
  • 2021-10-22
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多