返回

JS箭头函数和普通函数中的this

见解分享

箭头函数中的this

箭头函数(又称lambda函数)是ES6中引入的一种新的函数语法。箭头函数没有自己的this,它总是继承其外层函数的this值。这使得箭头函数非常适合用于事件处理程序和回调函数,因为您可以轻松地访问外层函数的this值。

// 外层函数
const outerFunction = function() {
  console.log(this); // {name: "John Doe"}

  // 箭头函数作为事件处理程序
  const handleClick = () => {
    console.log(this); // {name: "John Doe"}
  };

  // 将箭头函数作为回调函数传递
  setTimeout(() => {
    console.log(this); // {name: "John Doe"}
  }, 1000);
};

// 创建一个对象并将其作为外层函数的this值
const object = {
  name: "John Doe"
};

// 调用外层函数
outerFunction.call(object);

在上面的示例中,箭头函数handleClick()和setTimeout()中的回调函数都继承了outerFunction的this值,因此它们都能够访问object对象的name属性。

普通函数中的this

普通函数(也称为传统函数)具有自己的this关键字。普通函数的this值取决于函数的调用方式。如果普通函数作为对象的方法调用,那么它的this值将指向该对象。如果普通函数作为独立函数调用,那么它的this值将指向window对象(在严格模式下,this的值为undefined)。

// 普通函数作为对象的方法
const person = {
  name: "John Doe",
  greet: function() {
    console.log(this.name); // "John Doe"
  }
};

// 调用普通函数作为对象的方法
person.greet();

// 普通函数作为独立函数
const greet = function() {
  console.log(this); // window对象或undefined(严格模式)
};

// 调用普通函数作为独立函数
greet();

在上面的示例中,普通函数greet()作为对象的方法调用时,它的this值指向person对象,因此它能够访问person对象的name属性。但是,当普通函数greet()作为独立函数调用时,它的this值指向window对象或undefined(在严格模式下),因此它无法访问任何对象属性。

总结

箭头函数和普通函数在处理this关键字时存在着不同的行为。箭头函数没有自己的this关键字,它总是继承其外层函数的this值。普通函数具有自己的this关键字,它的this值取决于函数的调用方式。

在实际开发中,您应该根据需要选择使用箭头函数还是普通函数。箭头函数非常适合用于事件处理程序和回调函数,因为它们可以轻松地访问外层函数的this值。普通函数更适合用于需要控制this值的情况,例如作为对象的方法或独立函数调用时。