1. call
方法的作用
说明:在js中所有的函数都是Function的实例,而且对于Function来说,它的原型即Function.prototype
中含有很多东西,其中call,apply和bind
方法就是Function
原型中的方法,所以根据原型的规则,所有的函数都可以使用原型中属性和方法,所以来说,对于所有的函数都可以使用call、apply、bind
方法。
作用:而在JavaScript中,经常会有一个对象需要使用一个方法,但是该对象或者该对象的原型上并没有该方法,于是call、apply、bind
方法就派上用场了。 JS
中的this
指向一般是看 “.”
前面是谁,this
就是谁。call、apply、bind
一般用来改变函数的指向,并将其this
执行。下面看例子。
function show(attr){
console.log(this[attr]);
}
var person={
name:"aa",
age:14
};
show.call(person,"name"); // 输出 aa
apply 方法和bind方法类似。
2. 实例
function fn1(){console.log(1);}
function fn2(){console.log(2);}
fn1.call(fn2); // 输出 1
fn1.call.call(fn2); // 输出2
解释: fn1.call(fn2)
输出1很好理解,虽然call
改变了fn1
中的this
,但是输出结果中并没有this,因此结果是1; fn1.call.call(fn2)
首先执行的是第二个call
方法,该call
方法的this
是fn1.call
,因此首先将fn1.call
函数中的this
改为fn2
。随后执行的是fn1.call
的this,即为fn2
执行。
3. 参数
call
参数为(thisObj,argv1,argv2...)
当第一个参数是null
或undefined
或为空时,call
方法的this
中的this
为window
。严格模式下,参数是啥this就是啥。apply
参数为(thisObj,[argv1,argv2...])
其他与call
相同;bind
方法参数(thisObj,argv1,argv2...)
该方法在IE6-8
下不兼容,且该方法只绑定this
,不执行函数。
4.应用
求数组的最值:利用apply传参时自动将数组参数转化为值。
var arr=[1,2,3,4,5,6,7];
Math.min.apply(null, arr);
Math.max.apply(null, arr);