返回

函数声明与函数表达式:细说异同,助你选择自如

前端

在 JavaScript 的舞台上,函数并非魔法,而是一种有形的“变量”。作为这出戏的幕后主使,函数或函数表达式会潜移默化地操纵代码,实现意想不到的妙效。是时候揭开它们的面纱,一探究竟,并领悟在何种情境下该“请君入瓮”!

函数声明 vs 函数表达式:画地为牢

函数声明和函数表达式看似异曲同工,实则暗藏玄机。函数声明 以 function 开头,后跟函数名和圆括号参数列表,最后用大括号包裹函数体。而函数表达式 则巧妙地将函数分配给一个变量,用圆括号包裹函数体,没有独立的函数名。

举个栗子:

// 函数声明
function greet(name) {
  console.log(`Hello, ${name}!`);
}

// 函数表达式
const sayHi = function (name) {
  console.log(`Hello, ${name}!`);
};

this 的归属:谁与争锋

在 JavaScript 中,this 关键词代表当前执行上下文的引用。对于函数声明 ,this 指向全局对象,在严格模式下为 undefined;而对于函数表达式 ,this 指向定义函数时所在的作用域。

function greet() {
  console.log(this); // window
}

const sayHi = function() {
  console.log(this); // undefined
};

词法作用域:追根溯源

词法作用域决定了函数可以访问哪些变量。函数声明 在编译阶段就已经确定了其作用域,可以访问声明时所在的作用域中的所有变量,包括后来声明的变量。而函数表达式 的作用域是在运行时确定的,只能访问定义时所在的作用域中的变量。

const x = 10;

function greet() {
  const y = 20;
  console.log(x); // 10
  console.log(y); // 20
}

const sayHi = function() {
  const y = 30;
  console.log(x); // 10
  console.log(y); // 30
};

使用之道:因地制宜

如何取舍函数声明和函数表达式?明辨如下:

  • 当需要在全局作用域中定义一个函数时,使用函数声明。
  • 当需要动态创建函数或将函数作为参数传递给另一个函数时,使用函数表达式。
  • 当需要在特定作用域中绑定 this 时,使用函数表达式。
  • 当需要提升函数优先级或在早期访问函数时,使用函数声明。

总结:落幕点睛

函数声明和函数表达式是 JavaScript 中的两大法宝。函数声明更适合定义全局函数或在需要早期访问的情况下;函数表达式则更灵活,适用于动态创建函数或需要特定作用域绑定的场景。掌握它们的异同,巧妙运筹帷幄,定能谱写出代码的华美乐章!