javascript - 函数声明和函数表达式可以互换使用吗?

标签 javascript node.js function functional-programming

<分区>

我正在学习 Javascript 中的函数,但对函数声明和函数表达式的使用感到困惑。

假设我有以下代码:

function callFunction(fn) {
  fn();
}

// function expression
var sayHello1 = function() {
  console.log("Hello World!");
}

// function declaration
function sayHello2() {
  console.log("Hello World!");
}

callFunction(sayHello1); // Hello World!
callFunction(sayHello2); // Hello World!

我们可以很容易地看到,当将sayHello1(函数表达式)和sayHello2(函数声明)传递给callFunction(fn)时,都会生成相同的输出 Hello World!

是否存在我必须仅使用函数声明/函数表达式或者我可以一直互换使用它们的实际情况?

非常感谢!

最佳答案

他们都有自己的用例。函数声明是 hoisted 到脚本的顶部,可以在定义出现之前调用,而函数表达式只能在声明之后调用。

sayHello1(); // Won't work since variable expression is created after call
sayHello2(); // Will work since function declarations are hoisted

var sayHello1 = function() {
  console.log("Hello World!");
}

function sayHello2() {
  console.log("Hello World!");
}

命名函数表达式可用于递归调用:

var sayHello1 = function sayHelloFunc() {
  if (/* something */) {
    sayHelloFunc()
  }
}

关于javascript - 函数声明和函数表达式可以互换使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47851730/

相关文章:

javascript - 更改 MongoDB 文档/对象中的所有 MongoDB 对象 ID

javascript - 如何用 span 标签包裹每个菜单项的最后一个字母?

node.js - 如何使用 Node.JS 从 AWS 访问 OnPremise 系统

c++ - C语言中函数中的switch指针

javascript - 使用 javascript 聚焦并选择另一个输入文本字段?

javascript - 为什么我的全局变量不在函数之间携带其值

javascript - 如何在 swaggerexpress 中附加中间件,如express-validator

node.js - 在 Docker node.JS 项目中安全存储 SMTP 密码

javascript - 将 JavaScript 变量传递给 JavaScript 函数?

r - 修复要为x :y instead of only 1:y运行的函数