1. call()方法
1)可直接调用函数
2)括号里可传值,第一个值写要改变的this指向的位置,后面可以写入要传入的参数
3)可实现继承
改变this指向
function uname(a,b) {
console.log(this)
console.log(a+b)
}
var o = {
name: 'Herry'
}
uname.call(o,2,3)
若不改变this指向,自定义函数uname本身指向的是window,而call()方法改变了this指向,使其指向了o对象。
实现继承
// 实现继承
function Father(uname,uage,usex) {
this.uname = uname;
this.uage = uage;
this.usex = usex;
}
function Son(uname,uage,usex) {
Father.call(this,uname,uage,usex)
}
var son = new Son('Potter',18,'男')
console.log(son);
2. apply()方法
1)也是调用函数,改变this指向与call()方法同。
2)而括号内传入参数必须是数组,这是与call()方法不同之处。
3) apply的主要应用,比如可以利用apply借助于数学内置对象求最大值。Math.max()
// apply() 方法
function u(arr) {
console.log(this)
console.log(arr)
}
var h = {
name: 'Helen'
}
u.apply(h,[4])
// apply应用,借助于数学内置对象
var arr1 = [2,34,45,23,12];
var max = Math.max.apply(Math,arr1) // 为了规范,指向Math
console.log('数组中最大值为:' + max);
3. bind()方法
1)与call(),apply()区别,不会调用原来函数,若想调用需要赋值后再调用一遍,调用函数与call()同。
2)bind()在这三个方法中用的最多,后面会给实际例子。
// bind方法
// 与call(),apply()区别,不会调用原来函数,需要赋值后再调用一遍,调用函数与call()同
function f(a,b) {
console.log(this)
console.log(a - b)
}
var j = {
name: 'Kuper'
}
var h = f.bind(j,6,1);
h();
3)如果有的函数我们不需要立即调用,但是又想改变这个函数内部的this指向,此时用bind
例:我们有一个按钮,当我们点击了之后,就禁用这个按钮,3秒钟之后开启这个按钮
单个按钮
var btn = document.querySelector('button');
btn.addEventListener('click',function () {
this.disabled = true; // 这个this指向的是btn这个按钮
setTimeout(function () {
this.disabled = false; //this本身在定时器里指向的是window,通过bind()方法改变了this指向
}.bind(this),3000) // 这个this指向的是btn这个对象。因为这个this是在定时器外边而在btn这个对象里边
})
多个按钮