在使用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中的这类内置方法很有用。