HLJ 发布于
2025-06-11 10:07:29
0阅读

JavaScript 函数对象与命名函数表达式 (NFE)

上一篇文章:

JavaScript 全局对象

JavaScript 函数对象与命名函数表达式 (NFE)

在 JavaScript 中,函数是第一类对象,这意味着它们可以像其他对象一样被创建、传递和操作。下面我将介绍函数对象和命名函数表达式 (Named Function Expression, NFE) 的相关知识。

函数对象

在 JavaScript 中,函数是 Function 类型的实例,具有属性和方法。

创建函数的方式

  1. 函数声明:

    function sayHello() {
      console.log("Hello!");
    }
    
  2. 函数表达式:

    const sayHello = function() {
      console.log("Hello!");
    };
    
  3. 箭头函数 (ES6+):

    const sayHello = () => console.log("Hello!");
    

函数对象的属性

函数对象有一些有用的属性:

  • name: 函数名称
  • length: 函数期望的参数个数
  • prototype: 函数的原型对象
function sum(a, b) {
  return a + b;
}

console.log(sum.name); // "sum"
console.log(sum.length); // 2

命名函数表达式 (NFE)

命名函数表达式是指函数表达式中的函数有一个名称。

const factorial = function innerFact(n) {
  return n <= 1 ? 1 : n * innerFact(n - 1);
};

这里 innerFact 就是函数的名称,这种形式有几个特点:

NFE 的优点

  1. 可以在函数内部引用自身:

    const factorial = function innerFact(n) {
      if (n <= 1) return 1;
      return n * innerFact(n - 1); // 使用函数名递归调用
    };
    
  2. 调试时堆栈跟踪更清晰:

    • 匿名函数在错误堆栈中显示为 (anonymous function)
    • NFE 会显示函数名,便于调试
  3. 函数名在函数内部是常量:

    • 即使在函数内部也不能修改函数名绑定的值

NFE 的作用域

NFE 的函数名只在函数内部可见:

const foo = function bar() {
  console.log(typeof bar); // "function" - 在函数内部可用
};

console.log(typeof bar); // "undefined" - 在外部不可见

与函数声明的区别

NFE 和函数声明不同:

// 函数声明
function foo() {}

// 命名函数表达式
const bar = function baz() {};

函数声明会提升(hoisting),而 NFE 不会。

实际应用示例

// 使用 NFE 实现递归
const fibonacci = function fib(n) {
  if (n <= 1) return n;
  return fib(n - 1) + fib(n - 2);
};

console.log(fibonacci(10)); // 55

// 即使变量被重新赋值,函数名仍然有效
const original = fibonacci;
fibonacci = null;
console.log(original(10)); // 仍然可以工作,因为内部使用 fib 名称

总结来说,命名函数表达式(NFE)在需要递归调用或更好的调试体验时非常有用,它提供了函数内部的自我引用能力,同时保持了函数名的局部作用域。

当前文章内容为原创转载请注明出处:http://www.good1230.com/detail/2025-06-11/807.html
最后生成于 2025-06-13 20:53:06
上一篇文章:

JavaScript 全局对象

此内容有帮助 ?
0