JavaScript 函数对象与 NFE:你必须知道的秘密武器!

一、函数对象:不仅仅是代码块

在 JavaScript 中,函数对象继承自 Object,因此它们拥有所有对象的特性。这意味着:

  • 函数可以拥有属性: 你可以像给普通对象添加属性一样,给函数添加属性。

    javascript 复制代码
    function greet(name) {
      console.log(`Hello, ${name}!`);
    }
    
    greet.description = "Greets a person by name.";
    console.log(greet.description); // 输出: Greets a person by name.
  • 函数可以拥有方法: 函数对象继承了一些内置方法,例如 call(), apply(), 和 bind()。这些方法允许你控制函数执行时的 this 上下文和参数。

    javascript 复制代码
    function sayHello() {
      console.log(`Hello, ${this.name}!`);
    }
    
    const person = { name: "Alice" };
    sayHello.call(person); // 输出: Hello, Alice!
  • 函数可以被赋值给变量: 这是函数作为一等公民的关键特性。你可以将函数赋值给变量,然后通过变量名来调用它。

    javascript 复制代码
    const myFunc = function() {
      console.log("这是一个函数变量.");
    };
    
    myFunc(); // 输出: 这是一个函数变量.
  • 函数可以作为参数传递给其他函数: 这使得高阶函数(接受函数作为参数或返回函数的函数)成为可能,例如 map(), filter(), 和 reduce()。

    javascript 复制代码
    function operate(num1, num2, operation) {
      return operation(num1, num2);
    }
    
    function add(a, b) {
      return a + b;
    }
    
    const result = operate(5, 3, add);
    console.log(result); // 输出: 8

二、NFE (Named Function Expression):命名函数表达式的威力

NFE 是一种特殊的函数表达式,它在函数表达式中给函数一个名称。

  • 语法:

    javascript 复制代码
    const myFunc = function functionName() {
      // 函数体
    };

    注意:functionName 是 NFE 的名称。

  • 作用域: NFE 的名称 functionName 只能在函数内部访问。 这意味着它不能在函数外部被调用或引用。

    javascript 复制代码
    const factorial = function fact(n) {
      if (n <= 1) {
        return 1;
      }
      return n * fact(n - 1); // 只能在函数内部使用 'fact'
    };
    
    console.log(factorial(5)); // 输出: 120
    // console.log(fact(5)); // 报错: fact is not defined
  • 与函数声明的区别: 函数声明会被提升,这意味着你可以在声明之前调用它们。 NFE 不会被提升,你必须在定义之后才能使用它们。

    javascript 复制代码
    // 函数声明 (可以正常工作)
    console.log(add(2, 3)); // 输出: 5
    function add(a, b) {
      return a + b;
    }
    
    // NFE (会报错)
    // console.log(multiply(2, 3)); // 报错: Cannot access 'multiply' before initialization
    const multiply = function multiply(a, b) {
      return a * b;
    };
    console.log(multiply(2, 3)); // 输出: 6
相关推荐
jktantan3 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
前端·javascript·vue.js
总要学点什么3 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
2601_962885724 小时前
quotes 字段全解:涨跌幅、振幅、换手率的口径与单位
java·前端·spring
excel4 小时前
encodeURI 和 encodeURIComponent 有什么区别?
前端
前端精髓4 小时前
调用openrouter的免费API模型
java·前端·javascript
赛博守夜人4 小时前
AI安全攻防与治理之十四:AI 安全测试不能脱离传统安全,Web、API、移动端与模型攻击面的组合拳
前端·人工智能·安全
开开心心_Every5 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
networknomad5 小时前
OpenReplay:自己搭的会话回放工具,给前端排错用的
前端·其他
缓慢更新6 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
陈随易6 小时前
AI 运维服务器,安全又可靠的方法
前端·后端·程序员