改变函数内部this指向,call、apply、bind方法的异同
代码展示
var o = {
name: 'andy'
}
function fn(a, b) {
console.log(this);
console.log(a + b);
}
fn(1, 2) //此时this指向window,运行结果为3
fn.call(o, 1, 2) //返回=>{name: "andy"},运行结果为3
fn.apply(o, [1, 2]) //返回=>{name: "andy"},运行结果为3
fn.bind(o)(1, 2) //bind写法1:返回=>{name: "andy"},运行结果为3
var f = fn.bind(o, 1, 2) //bind写法2:f是bind返回的新函数
f(); //调用新函数 this指向的对象是o 参数使用逗号隔开
三者的异同
共同点
不同点
- call和apply会调用函数,并且改变函数内部的this指向
- call和apply传递的参数不一样,call传递参数使用逗号隔开,apply使用数组传递
- bind不会调用函数,需要定义新函数调用
应用场景
- call经常做继承
- apply经常和数组有关系,比如借助于数学对象实现数组最大值和最小值
- bind不调用函数,但是还想改变this指向,比如改变定时器内部的this指向