1.apply
apply接收的参数为两个,第一个是指针的指向,第二个是函数接收的参数,类型为数组类型。只临时改变this指向一次
function a(...args) {
console.log("被改变this指针",args);
}
let obj = {}
fn.apply(obj,[1,2,3]);//如果第一个参数为null或者undefined 那么 this指向window对象
当使用js写重载函数时,可以使用到apply
function addMethod(object,name,fn) {
//把原来的object[name]方法,保存在old中
var old = object[name];
//重新定义 object[name]方法
object[name] = function() {
//如果函数需要的参数 和实际传入的参数的个数相同,就直接调用fn
if (fn.length === arguments.length) { //函数的length表示形参的个数,arguments是所有函数除了箭头函数都有的一个类数组对象,是局部变量
return fn.apply(this,arguments);
} else {//如果不相同,就判断old是不是函数,如果是就调用old,也就是原来保存的object[name]方法
return old.apply(this,arguments);
}
}
}
2.call
跟apply基本一致,除了第二个参数不是数组,而是一个逗号分隔的参数列表。
function a(...args) {
console.log("被改变this指针",args);
}
let obj = {}
fn.call(obj,1,2,3);//如果第一个参数为null或者undefined 那么 this指向window对象
3.bind
bind的参数方式和call一致。bind方法创建一个新的函数,在bind被调用时,新函数的this指向为bind的第一个参数,其余参数作为新函数的参数,这个改变是永久的,创建的新函数this永久指向第一个bind参数。其余两个改变指向是立即执行,而bind是被改变函数调用时才会执行。