【问题标题】:What exactly is function expression? [duplicate]函数表达式到底是什么? [复制]
【发布时间】:2021-09-30 15:29:38
【问题描述】:

我之前认为函数表达式可以是存储在某个变量中的任何函数。比如这是函数表达式,因为函数存储在func变量中。

let func = function() {
   console.log(5);
};

这里是函数表达式,因为回调函数存储在函数的参数callback中。

function func(callback) {
   callback();
};
func(function() {
   console.log(5);
});
//That's what I mean:
//let callback = function() {...}

但是……最近我发现这个回调函数也可以看作是函数表达式。为什么?此函数未存储在某个变量中。

let arr = [18, 50];
let obj = {
    name: 'Karina',
};
arr.forEach(function func(value) {
    console.log(`${this.name} is ${value} years old`);
}, obj);

那么,我的问题是......究竟是什么让函数函数表达式?

【问题讨论】:

标签: javascript function expression


【解决方案1】:

之前我认为函数表达式可以是存储在某个变量中的任何函数。

没有。要存储的变量无关紧要。 let func = …; 不是函数表达式的一部分,函数表达式只是出现在中间的部分(表达式)。

  let func = function() {
//           ^^^^^^^^^^^^
     console.log(5);
//^^^^^^^^^^^^^^^^^^
  };
//^

此函数未存储在某个变量中。

实际上,您的第二个和第三个 sn-p 之间没有区别。您将从表达式构造的函数传递给一个函数,而不管该函数是如何声明的(带参数、使用 rest 语法、不带参数,或者像 forEach 这样的内置函数)。

但是是的,你可以完全没有变量的函数表达式,比如

  !function() {…}();
// ^^^^^^^^^^^^^^
  void function() {…};
//     ^^^^^^^^^^^^^^
  (function() {…})();
// ^^^^^^^^^^^^^^

基本上,函数表达式只是函数对象的文字语法(如:对象文字、字符串文字)。

【讨论】:

    【解决方案2】:

    我也在学习函数式编程,发现使用函数作为值确实是一个函数表达式,正如你所说,通过将匿名函数分配给变量。但我认为主要区别在于函数声明被提升对吗?所以上下文开始发挥作用,所有这些有趣的东西:)

    【讨论】:

    • 请不要写出猜测的答案。
    • “使用函数作为值确实是函数表达式” 并不准确。给定const foo = () => {};foo 是一个“作为值”的函数。但(function foo(){}) 是函数表达式,foo 不是。此外,匿名与函数表达式完全无关。最后一点更正确:函数声明被提升到它们的函数或全局范围,而函数表达式不是。
    • @SebastianSimon const foo = () => {};const foo = function [name]() {}; 都包含一个 [array] 函数表达式。只要 [arrow] 函数是表达式的一部分,您就会谈论 [arrow] 函数表达式。
    • 您确实是正确的,只有函数声明才会被提升。以下不起作用doIt(); const x = function doIt(){};
    • @t.niese 不,const foo = () => {}; 是一个词法声明。反正我不是在说这个。我正在比较 foo(function foo(){}),它们分别是标识符和函数表达式(为了清楚起见,在括号内)。
    猜你喜欢
    • 2022-11-15
    • 2012-12-31
    • 2013-03-29
    • 2015-06-21
    • 2012-10-19
    • 2013-10-10
    • 2019-10-12
    • 1970-01-01
    • 2020-07-31
    相关资源
    最近更新 更多