运用call、apply、 bind进行强制改变this的指向
改变目标函数内部的this指向并调用该函数
call方法强制改变this的指向
function f() {
console.log(this);
}
f.call("hello", [55, 66]);
- 没有直接调用
f()
,经过f.call()
调用f函数
内部的call方法
间接的调用f函数
- 如果给的第一个参数不是对象类型,那么将会将该参数转换为对象——基本包装类型,如果该参数无法转换成,那么该参数无效,之前指向谁,现在仍然指向谁——
undefined
unll
- 第二个参数开始,就是将参数作为实参传入到
f函数
。
apply方法强制改变this的指向
function f(x, y) {
console.log(this);
}
f.apply("hello", 66);
- 没有直接调用
f()
,经过f.appy()
调用f函数
内部的apply方法
间接的调用f函数
。- 如果给的第一个参数不是对象类型——
undefined
unll
,那么将会将该参数转换为对象——基本包装类型,如果该参数无法转换成,那么该参数无效,之前指向谁,现在仍然指向谁。- 第二个参数数组就是要传入到函数的参数列表,数组里面的元素将会被传入到函数。
apply方法的应用
需求:想要得到一个数组中的最大值。
希望能使用Math.max()
得到数组中的最大值,结果返回的是NaN
,这是因为该函数中传入的必须是数值,如:Math.max(11, 22, 66, 33)
var arr = [11, 22, 55, 44];
console.log(Math.max(arr));
//NaN
apply
可以帮助实现打开数组,因此可以使用以下代码进行实现
var arr = [11, 22, 55, 44];
console.log(Math.max.apply(null, arr));
//55
bind方法强制改变this的指向
function f (x, y) {
console.log(x + y);
console.log(this)
}
var ff = f.bind([99], 9, 6);
ff();
//15
//Array [ 99 ]
console.log(ff === f);
//false
- 只为
f函数
改变this
指向并返回一个新的函数,换句话说,没有使f
函数发生改变- 该方法的参数形式与
call
的参数形式一样,但是bind
方法是半自动的,f
函数不能自动调用,需要手动调用