返回

初探函数声明、函数表达式、构造函数的三种用法

前端

函数声明

函数声明是最传统和常用的创建函数的方式。它使用function,后面跟函数名和参数列表,最后是用花括号括起来的一系列语句。函数声明可以出现在任何地方,包括脚本的头部、函数体内、循环体内等等。

// 函数声明
function sum(a, b) {
  return a + b;
}

函数声明的一个特点是,它会在执行上下文创建时提升到该执行上下文的顶部。这意味着,函数声明可以在它被声明之前就被调用。

函数表达式

函数表达式是一种更灵活的方式来创建函数。它使用一个匿名的函数字面量,即用花括号括起来的一系列语句。函数表达式通常被赋给一个变量,以便以后可以引用它。

// 函数表达式
const sum = function(a, b) {
  return a + b;
};

函数表达式不能在它被声明之前就被调用,因为在执行上下文创建时,它不会被提升。

构造函数

构造函数是一种特殊的函数,用于创建对象。它与其他函数的不同之处在于,它必须使用new关键字来调用。当使用new关键字调用构造函数时,会创建一个新的对象,并且该对象的[[Prototype]]内部属性被设置为构造函数的prototype属性。

// 构造函数
function Person(name, age) {
  this.name = name;
  this.age = age;
}

构造函数通常用于面向对象编程中创建对象。

求和场景比较

为了更直观地理解这三种函数的用法和区别,我们来看一个求和的简单场景。

// 函数声明
function sum(a, b) {
  return a + b;
}

// 函数表达式
const sum = function(a, b) {
  return a + b;
};

// 构造函数
function Sum(a, b) {
  this.a = a;
  this.b = b;
  this.sum = function() {
    return this.a + this.b;
  };
}

// 调用函数
console.log(sum(1, 2)); // 3
console.log(sum(3, 4)); // 7

const s1 = new Sum(1, 2);
const s2 = new Sum(3, 4);
console.log(s1.sum()); // 3
console.log(s2.sum()); // 7

从这个场景中,我们可以看到:

  • 函数声明和函数表达式都可以用于求和,而且它们的调用方式是一样的。
  • 构造函数也可以用于求和,但它的调用方式不同,需要使用new关键字来调用。
  • 构造函数创建的对象有一个sum方法,该方法可以用来求和。

变量提升和闭包

在讨论函数声明、函数表达式和构造函数时,我们还需要了解变量提升和闭包的概念。

变量提升是指在执行上下文创建时,所有声明的变量和函数都会被提升到该执行上下文的顶部。这意味着,变量和函数可以在它们被声明之前就被使用。

闭包是指函数可以访问它所在的作用域中的变量,即使该函数已经执行完毕。这使得闭包非常适合于创建私有变量和方法。

结语

函数声明、函数表达式和构造函数是JavaScript中创建函数的三种常见方式。每种方式都有其自身的特点和用途。通过本文的介绍,希望您能够对这三种函数的用法和区别有更深入的了解。