call,apply,bind方法都是被函数调用的,不同的是call,apply是立即执行的,bind是需要调用才能执行
call传的是字符串
apply传的是数组
bind传的字符串和数组都可以
如图所示:
function animal(x,y){
console.log(this.name,x,y)
}
let obj ={
name:'dog'
}
animal.call(obj,'age','12')//dog age 12
animal.apply(obj,['age','12'])//dog age 12
var a = animal.bind(obj,['age','12'])//dog ['age','12']
a()
console.log(Math.floor.call(Math,'12.34'))//12
function click(){
this.name='张三';
setTimeout(function(){
this.name='赵四'
console.log(this.name)
},2000).bind(this)
setTimeout(()=>{
this.name='王五'
console.log(this.name)
},4000).bind(this)//不支持箭头函数
}
call主要用于函数改变this指向集成属性,apply主要用于函数改变this指向,主要应用于数组的操作,列如求最大最小值,bind方法主要用于函数改变this指向,应用于settimeout定时器的this指向
普通函数和箭头函数中的this指向:
一、普通函数中的this
隐式绑定:this就是指向最近的一个调用者。
默认绑定:默认情况下,没有直接调用者,在非严格模式下,this指向window ,严格模式下(设置了’use strict’),this为undefined 。有个例外,es6引进了class,class定义的类中的方法要是没对象调用,两种模式下this都是为undefined,new构造函数中的方法没对象调用时,还是会遵守默认绑定规则。
显式绑定:当使用call,apply,bind绑定的,改变this的指向,如果函数或者方法调用之前带有关键字new,它就构成构造函数调用。
this 绑定规则优先级:
默认绑定 < 隐式绑定 < 显式绑定 < new 绑定
二:箭头函数中的this指向的是上一层的对象,没有的话则指向window