返回

this,apply、call

前端

前言

在JavaScript中,this是一个非常重要的,它用于指向当前执行代码的对象。this的指向可以根据函数的调用方式而改变,这可能会导致一些混淆和错误。apply和call方法是两个可以帮助我们控制this指向的函数,它们允许我们指定this指向的对象,无论该函数是如何被调用的。

this的指向

在JavaScript中,this的指向始终坚持一个原理:“this永远指向最后调用它的那个对象”,切记这句话。下面看几个例子。

例一:最基本的使用,函数say是obj调用的,函数中的this指向obj

const obj = {
  name: 'obj',
  say: function() {
    console.log(this.name); // obj
  }
};

obj.say(); // obj

例二:使用new关键字调用函数,this指向新创建的对象

function Person(name) {
  this.name = name;
  this.say = function() {
    console.log(this.name); // John
  }
}

const person = new Person('John');

person.say(); // John

例三:函数作为参数传递给另一个函数,this指向调用它的函数

const obj = {
  name: 'obj',
  say: function() {
    console.log(this.name); // obj
  }
};

function callSay(func) {
  func();
}

callSay(obj.say); // obj

apply和call方法

apply和call方法都是用来改变this指向的函数,它们的区别在于参数的传递方式。apply方法接受两个参数,第一个参数是this要指向的对象,第二个参数是一个数组,包含要传递给函数的参数。call方法也接受两个参数,第一个参数是this要指向的对象,第二个参数是传递给函数的第一个参数,第三个参数是传递给函数的第二个参数,以此类推。

下面看一个例子:

const obj = {
  name: 'obj',
  say: function(arg1, arg2) {
    console.log(this.name, arg1, arg2);
  }
};

obj.say('hello', 'world'); // obj hello world

// 使用apply方法
apply(obj, ['hello', 'world']); // obj hello world

// 使用call方法
call(obj, 'hello', 'world'); // obj hello world

总结

this关键字、apply和call方法是JavaScript中非常重要的概念,它们可以帮助我们理解函数的作用域和绑定。通过熟练掌握这些概念,我们可以写出更加健壮和可维护的代码。