定义
call()、apply()、bind()
这三者都是用来重新定义this
这个对象的
从下面的代码中可以看出,默认obj.myFun()
和shows()
中的this
分别指向obj
对象和Window
对象。通过call()、apply()、bind()
将this
指向了db
;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| var name = '小往', age = 17; var obj = { name: '小组', objAge: this.age, myFun: function () { console.log(this); //console.log(this.name + ';obj年龄:' + this.objAge + 'age 年龄:' + this.age); } }
function shows() { console.log(this); }
var db = { name: '笑笑', age: 22, };
obj.myFun(); shows();
obj.myFun.call(db); obj.myFun.apply(db); obj.myFun.bind(db)();
// {name: "小组", objAge: 17, myFun: ƒ}name: "小组"objAge: 17myFun: ƒ ()__proto__: Object // Window {parent: Window, opener: n ... ... ()__proto__: Window // {name: "笑笑", age: 22} // {name: "笑笑", age: 22} // {name: "笑笑", age: 22}
|
三者区别
bind()
方法返回的是一个新的函数,必须要调用它才会被执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| var name = '小往', age = 17; var obj = { name: '小组', objAge: this.age, myFun: function () { console.log(this.name + ';obj年龄:' + this.objAge + 'age 年龄:' + this.age); } }
var db = { name: '笑笑', age: 22, };
obj.myFun.call(db); obj.myFun.apply(db); obj.myFun.bind(db)();
|
call()、apply()、bind()
三个函数的第一个参数都是this
的指向对象,区别在于第二个参数,apply()
需要传入一个数组,call()、bind()
依次传入参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| var name = '小往', age = 17; var obj = { name: '小组', objAge: this.age, myFun: function (from, to) { console.log(this.name + ';obj年龄:' + this.objAge + 'age 年龄:' + this.age + ',' + from + '去往' + to); } }
var db = { name: '笑笑', age: 22, };
obj.myFun.call(db, '杭州', '上海'); obj.myFun.apply(db, ['杭州', '上海']); obj.myFun.bind(db, '杭州', '上海')(); obj.myFun.bind(db, ['杭州', '上海'])(); console.log(obj.name)
|