在使用JavaScript进行编程时,我总是对JavaScript的工作方式感到困惑。就像Kyle Simpson所说的那样

我认为没有人真正了解JS,至少没有人能够完完全全了解。——Kyle Simpson

图片 任何正在学习JavaScript的程序员都肯定会遇到this关键字。因此,让我们从this开始。在本文中,我们将了解如何结合this使用bind(),call()和apply()。希望阅读本文后能解决大家的疑问。

出发!

关于this?

JavaScript中的“this”设置为正在执行功能的当前环境。

优秀的程序员经常会感叹于它的混乱,对this关键字的引用模糊不清。

因此,为了清楚地定义this关键字所属的对象,我们需要使用诸如bind(),call()和apply()之类的方法。

1. bind()

Bind()方法可以创建一个新函数,该函数在调用时将其this关键字设置为提供的值。

举个例子



var user = {
  name: 'Ryan',
  getName: function() {
    return this.name;
  }
}
function displayInfo() {
  console.log("Hello " + this.getName());
}
var getInfo = displayInfo.bind(user);
getInfo();
// Hello Ryan

当我们使用bind()时,将创建一个新的displayInfo实例,并将用户对象绑定到其this关键字。注意:每当使用bind()创建新实例时,它都会复制displayInfo函数。因此,当我们在displayInfo中调用this.getName()时,将获得名称“Ryan”。而且,我们还可以访问用户对象的所有属性。

此外,bind允许你在设置这个值的时候,同时允许你之后执行该函数,因为它会返回一个新的函数对象。

2. call()

call()方法调用具有给定值和单独提供参数的函数。

这是什么意思?

这意味着我们可以调用任何函数,并明确指定在调用函数中应引用this。

举个例子


var user = {
  name: 'Ryan',
  getName: function() {
    return this.name;
  }
}
function displayInfo(greeting, greet2) {
  console.log( greeting + ' ' + greet2 +' ' + this.getName() +"?");
}
displayInfo.call(user, 'Hello!', 'How are you');
//Hello! How are you Ryan?

call()方法接受第一个参数作为this引用,此后,我们可以将其他参数传递给函数。这里,我们调用displayInfo()连带其this设置到用户对象,以及用'Hello'作为附加参数。

注意:call()方法不会像bind()那样复制函数。

3. apply()

apply()方法类似于call()方法。两者都具有完全相同的目的。

注意:call()和apply()之间的唯一区别是call()期望单独传递所有参数,而apply()期望传递所有参数的单个数组。

还是举个例子


var user = {
  name: 'Ryan',
  getName: function() {
    return this.name;
  }
}
function displayInfo(greeting, greet2) {
  console.log( greeting + ' ' + greet2 +' ' + this.getName() +"?");
}
displayInfo.call(user, 'Hello!', 'How are you'); 
//Hello! How are you Ryan?


displayInfo.apply(user, ['Hello!' , 'How are you']); 
//Hello! How are you Ryan?

怎么用?

1.如果希望以后在某个事件的特定上下文中调用该函数,请使用.bind()。

2.若要立即调用该函数并修改上下文,请使用.call()或.apply()。

可以参考mdn docs 以了解更多有关信息,并查看实际中的实现。

JavaScript中的这类内置方法很有用。