1.call方法
call() 方法调用一个对象。简单理解为调用函数的方式,但是它可以改变函数的 this 指向。
fun.call(thisArg, arg1, arg2, ...)
-thisArg:在 fun 函数运行时指定的 this 值。
-arg1,arg2:传递的其他参数。
-返回值就是函数的返回值,因为它就是调用函数。
-因此当我们想改变 this 指向,同时想调用这个函数的时候,可以使用 call,比如继承。
例:
var o = {
name:'chensw'
}
function sw(){
console.log(this)
}
sw.call(o) //{name: "chensw"}
———————————————————————————————————
function animal(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
function cat(name,age,sex){
animal.call(this,name,age,sex)
}
var mycat = new cat('mimi',3,'男')
mycat //cat {name: "mimi", age: 3, sex: "男"}
2.apply方法
apply() 方法调用一个函数。简单理解为调用函数的方式,但是它可以改变函数的 this 指向。
fun.apply(thisArg, [argsArray])
-thisArg:在 fun 函数运行时指定的 this 值。
-arg1,arg2:传递的值,必须包含在里面。
-返回值就是函数的返回值,因为它就是调用函数。
- 因此 apply 主要跟数组有关系,比如使用 Math.max() 求数组的最大值。
例:
var testAry = [1,2,3,4,5,2,43,5,6,7,8,9,34];
var testMin = Math.min.apply(null,testAry);//严格模式下传null会报错,可改为this/Math
testMax = Math.max.apply(null,testAry);
console.log(testMin,testMax);//1,43
3.bind 方法
bind() 方法不会调用函数。但是能改变函数内部this 指向。
fun.bind(thisArg, arg1, arg2, ...)
-thisArg:在 fun 函数运行时指定的 this 值。
-arg1,arg2:传递的其他参数。
-返回由指定的 this 值和初始化参数改造的原函数拷贝。
-因此当我们只是想改变 this 指向,并且不想调用这个函数的时候,可以使用 bind。
例:
var btns = document.querySelectorAll('button');
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = function() {
this.disabled = true;
setTimeout(function() {
this.disabled = false;//这个this 指向的是btn 这个对象
}.bind(this), 2000);
}
}
4.总结
相同点:
都可以改变函数内部的this指向。
区别点:
1.call和apply都会调用函数,并且改变函数内部this问题。
2.call和apply 传递的参数不一样,call 传递参数 aru1, aru2..形式 apply 必须数组形式[arg]
3.bind 不会调用函数,但可以改变函数内部this指向。
主要应用场景:
1.call 经常做继承。(在es6之前)
2.apply 经常跟数组有关系。 比如借助于数学对象实现数组最大值最小值。
3.bind 不调用函数,但是还是能改变this指向。比如改变定时器内部的this指向。