call,apply,bind的应用和特点
共同点是使用在定时器的匿名函数{}.bind(),是内置对象原型对象的方法.bind(),普通函数名.bind()(),字面量对象的方法.bind()()
call的第一个参数是改变方法的this指向,之后的参数是传递方法的参数,直接生效
//伪数组 getElementsByTagName()没有数组原型中方法
var obj={
0:100,
1:10,
2:11,
3:20,
length:4
}
Array.prototype.push.call(obj,30)
console.dir(obj)

apply的第一个参数是改变方法的this指向,第二个参数是一个数组,直接生效
//像Math.max(3,5,6)这种需要多个实参
var arr=[4,10,1,3,6]
//apply把数组每一项展开
console.log(Math.max.apply(null,arr))//10
console.log(Math.max.apply(Math,arr))//10
bind的第一个参数是改变方法的this指向,之后的参数是传递方法的参数,而且后续方法的参数会进行合并,需要调用才生效
//bind使用定时器的匿名函数和对象方法改变this
//定时器不需调用,但方法需要调用
var obj={
name:'zs',
fun:function(){
setTimeout(function(){
console.log(this.name)
}.bind(this),1000)
},
fun1:function(){
console.log(this.name)
}
}
var obj1={name:'ls'}
obj.fun()
obj.fun1.bind(obj1)()
function fn1(a,b){
console.log(this.name,a,b)
}
fn1.bind(obj1,1)(2)
fn1.call(obj1,1,2)
