大多数人都知道,使用apply、call、bind可以调用函数,并改变函数中this
的指向。
做一个简单记录,免得以后忘记了。
函数.apply(obj, arg[])
this
指向的对象JAVASCRIPT
var user = {
username: "半月无霜",
showInfo: function(age){
console.log(`名字:${this.username},年龄:${age}`);
}
}
// 普通调用
user.showInfo(18);
// 定义一个其他对象,使用apply
var other = {
username: "九月",
age: 19
}
user["showInfo"].apply(other, [other.age]);
函数.call(obj, args...)
this
指向的对象,后面的参数跟着原本的函数就好,加在后面就行JAVASCRIPT
var user = {
username: "半月无霜",
showInfo: function(age, sex){
console.log(`名字:${this.username},年龄:${age},性别:${sex}`);
}
}
// 普通调用
user.showInfo(18, "男");
// 定义一个其他对象,使用call
var other = {
username: "yooyeon",
age: 17,
sex: "女"
}
user["showInfo"].call(other, other.age, other.sex);
bind
和前面两个有所不同,先看示例,一会再讲使用
JAVASCRIPT
var user = {
username: "半月无霜",
showInfo: function(age, sex){
console.log(`名字:${this.username},年龄:${age},性别:${sex}`);
}
}
// 普通调用
user.showInfo(18, "男");
// 定义一个其他对象,使用bind
var other = {
username: "yooyeon",
age: 17,
sex: "女"
}
// 返回了一个改变了this指向的函数
var showInfo2 = user.showInfo.bind(other);
showInfo2(other.age, other.sex);
可以看到,bind
在使用的时候会返回一个改变this
的新函数,使用需要重新调用这个新函数才行。
传参和call
一致,在后面添加原函数的参数就可以
JAVASCRIPT
// 也可以这样写,效果是一样的
user.showInfo.bind(other, other.age, other.sex)();
// 也可以这样
var showInfo2 = user.showInfo.bind(other, other.age);
showInfo2(other.sex);
上面对比,总结一下apply
、call
、bind
他们的异同点
this
的指向,且都将作为第一个参数进行使用this
的对象之后,将原来的函数参数,打包成一个数组进行传参this
的对象之后,依次传入原本的函数参数call
相同;二次传参首次传参与call
类似,后一次调用传参补全原函数剩余的参数函数.apply()
或者函数.call()
,即可发起调用我是半月,祝你幸福!!!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。