返回

JavaScript中的函数类型和作用域链

前端

JavaScript中的函数类型

JavaScript中的函数可以分为两大类:声明函数和表达式函数。

声明函数

声明函数使用function声明,后面跟函数名和一对圆括号。函数体用一对大括号括起来。例如:

function sayHello() {
  console.log("Hello, world!");
}

表达式函数

表达式函数使用箭头函数或匿名函数的形式声明。箭头函数使用=>符号,后面跟函数体。匿名函数使用function关键字,后面跟一对圆括号,函数体用一对大括号括起来。例如:

const sayHello = () => {
  console.log("Hello, world!");
};

const sayHello2 = function() {
  console.log("Hello, world!");
};

函数的作用域链

函数的作用域链是指函数可以访问的变量对象列表。函数的作用域链从当前函数开始,依次向上追溯到全局对象。例如,以下代码中,sayHello函数的作用域链为:

function sayHello() {
  const message = "Hello, world!";
  console.log(message);
}

sayHello();

sayHello函数的作用域链为:

  1. sayHello函数的作用域对象
  2. 全局对象

sayHello函数执行时,它首先在自己的作用域对象中查找变量message。如果找不到,它会继续在全局对象中查找。如果在全局对象中找到了变量message,它就会输出该变量的值。

不同类型的函数对作用域链的影响

不同类型的函数对作用域链的影响是不同的。

声明函数

声明函数的作用域链是从当前函数开始,依次向上追溯到全局对象。例如,以下代码中,sayHello函数的作用域链为:

function sayHello() {
  const message = "Hello, world!";
  console.log(message);
}

sayHello();

sayHello函数的作用域链为:

  1. sayHello函数的作用域对象
  2. 全局对象

sayHello函数执行时,它首先在自己的作用域对象中查找变量message。如果找不到,它会继续在全局对象中查找。如果在全局对象中找到了变量message,它就会输出该变量的值。

表达式函数

表达式函数的作用域链是从当前函数开始,依次向上追溯到其父函数的作用域对象,再依次向上追溯到全局对象。例如,以下代码中,sayHello函数的作用域链为:

const sayHello = () => {
  const message = "Hello, world!";
  console.log(message);
};

sayHello();

sayHello函数的作用域链为:

  1. sayHello函数的作用域对象
  2. 全局对象

sayHello函数执行时,它首先在自己的作用域对象中查找变量message。如果找不到,它会继续在其父函数的作用域对象中查找。如果在父函数的作用域对象中找到了变量message,它就会输出该变量的值。如果在父函数的作用域对象中找不到变量message,它会继续在全局对象中查找。如果在全局对象中找到了变量message,它就会输出该变量的值。

常见问题

不同方式创建出来的函数会不一样吗?如果会,那么到底有什么不一样呢?

不同方式创建出来的函数在作用域链上是不同的。声明函数的作用域链是从当前函数开始,依次向上追溯到全局对象。表达式函数的作用域链是从当前函数开始,依次向上追溯到其父函数的作用域对象,再依次向上追溯到全局对象。

我可以使用var关键字声明函数吗?

不可以。var关键字只能声明变量,不能声明函数。

我可以使用箭头函数声明类吗?

不可以。箭头函数不能声明类。