大话前端:ES6中箭头函数与传统函数的区别

2023-12-16 04:45:14

我们使用办公室的比喻,具体化解释一下传统函数和箭头函数的区别:

想象this关键字是一个“工作证”,这个工作证代表一个函数在任何给定时刻所代表的或属于的对象。

  1. 在传统函数中:这个“工作证”(this)就像是办公室员工的可变工作证。这个员工(函数)在不同的部门(不同的执行上下文)工作时,他的工作证上的部门信息会相应变化。例如,当他在销售部门工作时,他的工作证显示他属于销售部门,负责销售相关的任务。如果他被调到市场部门,他的工作证上的部门信息就会改为市场部门,他的工作内容也相应改变。这样,这个员工的职责(this的值)随着他所在部门的改变而改变。

  2. 在箭头函数中:想象这个员工(箭头函数)有一个固定的工作证,上面永远显示他最初被分配的部门,比如客户服务部门。无论他去办公室的哪个地方,甚至是外出,他的工作证上始终显示他属于客户服务部门,他的工作职责也始终与客户服务相关。在这种情况下,这个员工的职责(this的值)是固定的,始终指向他被创建时所属的部门,不会因为他所处的位置或上下文的改变而改变。

通过这个比喻,this关键字就像是函数的“工作证”,在传统函数中,这个工作证的部门信息会根据函数执行的上下文变化而变化;而在箭头函数中,这个工作证的部门信息是固定的,始终指向函数被创建时所属的部门。

当然,让我们通过一个简单的JavaScript代码示例来进一步说明this关键字在传统函数和箭头函数中的行为差异:

// 定义一个对象
let office = {
    department: "销售部门",
    getDepartment: function() {
        return function() {
            return this.department; // 这里的 'this' 将不指向 office 对象
        }
    },
    getDepartmentArrow: function() {
        return () => this.department; // 这里的 'this' 仍然指向 office 对象
    }
};

// 使用传统函数
let traditionalFunc = office.getDepartment();
console.log(traditionalFunc()); // 输出:undefined,因为 'this' 不指向 office 对象

// 使用箭头函数
let arrowFunc = office.getDepartmentArrow();
console.log(arrowFunc()); // 输出:"销售部门",因为 'this' 指向 office 对象

在这个示例中,office对象有两个方法:getDepartmentgetDepartmentArrowgetDepartment使用传统函数返回另一个函数,而getDepartmentArrow使用箭头函数返回一个函数。

  • getDepartment中,内部返回的函数是一个传统函数,它的this不会自动绑定到office对象。因此,当调用traditionalFunc()时,this.departmentundefined,因为this没有指向office对象。

  • getDepartmentArrow中,返回的是一个箭头函数。箭头函数自动捕获包围它的上下文的this值,即office对象。因此,当调用arrowFunc()时,它正确地输出office对象的department属性值,即“销售部门”。

这个例子展示了如何在不同类型的函数中处理this关键字,以及它们在实际代码中如何表现。

文章来源:https://blog.csdn.net/weixin_43903608/article/details/134903424
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。