一、函数对象:不仅仅是代码块
在 JavaScript 中,函数对象继承自 Object
,因此它们拥有所有对象的特性。这意味着:
-
函数可以拥有属性: 你可以像给普通对象添加属性一样,给函数添加属性。
javascriptfunction 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
上下文和参数。javascriptfunction sayHello() { console.log(`Hello, ${this.name}!`); } const person = { name: "Alice" }; sayHello.call(person); // 输出: Hello, Alice!
-
函数可以被赋值给变量: 这是函数作为一等公民的关键特性。你可以将函数赋值给变量,然后通过变量名来调用它。
javascriptconst myFunc = function() { console.log("这是一个函数变量."); }; myFunc(); // 输出: 这是一个函数变量.
-
函数可以作为参数传递给其他函数: 这使得高阶函数(接受函数作为参数或返回函数的函数)成为可能,例如
map()
,filter()
, 和reduce()
。javascriptfunction 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 是一种特殊的函数表达式,它在函数表达式中给函数一个名称。
-
语法:
javascriptconst myFunc = function functionName() { // 函数体 };
注意:
functionName
是 NFE 的名称。 -
作用域: NFE 的名称
functionName
只能在函数内部访问。 这意味着它不能在函数外部被调用或引用。javascriptconst 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