JavaScript中的函数类型和作用域链
2024-01-31 17:12:08
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
函数的作用域链为:
sayHello
函数的作用域对象- 全局对象
当sayHello
函数执行时,它首先在自己的作用域对象中查找变量message
。如果找不到,它会继续在全局对象中查找。如果在全局对象中找到了变量message
,它就会输出该变量的值。
不同类型的函数对作用域链的影响
不同类型的函数对作用域链的影响是不同的。
声明函数
声明函数的作用域链是从当前函数开始,依次向上追溯到全局对象。例如,以下代码中,sayHello
函数的作用域链为:
function sayHello() {
const message = "Hello, world!";
console.log(message);
}
sayHello();
sayHello
函数的作用域链为:
sayHello
函数的作用域对象- 全局对象
当sayHello
函数执行时,它首先在自己的作用域对象中查找变量message
。如果找不到,它会继续在全局对象中查找。如果在全局对象中找到了变量message
,它就会输出该变量的值。
表达式函数
表达式函数的作用域链是从当前函数开始,依次向上追溯到其父函数的作用域对象,再依次向上追溯到全局对象。例如,以下代码中,sayHello
函数的作用域链为:
const sayHello = () => {
const message = "Hello, world!";
console.log(message);
};
sayHello();
sayHello
函数的作用域链为:
sayHello
函数的作用域对象- 全局对象
当sayHello
函数执行时,它首先在自己的作用域对象中查找变量message
。如果找不到,它会继续在其父函数的作用域对象中查找。如果在父函数的作用域对象中找到了变量message
,它就会输出该变量的值。如果在父函数的作用域对象中找不到变量message
,它会继续在全局对象中查找。如果在全局对象中找到了变量message
,它就会输出该变量的值。
常见问题
不同方式创建出来的函数会不一样吗?如果会,那么到底有什么不一样呢?
不同方式创建出来的函数在作用域链上是不同的。声明函数的作用域链是从当前函数开始,依次向上追溯到全局对象。表达式函数的作用域链是从当前函数开始,依次向上追溯到其父函数的作用域对象,再依次向上追溯到全局对象。
我可以使用var
关键字声明函数吗?
不可以。var
关键字只能声明变量,不能声明函数。
我可以使用箭头函数声明类吗?
不可以。箭头函数不能声明类。