相同点:都可以修改this指向
异同点:1.传参方式不同 call是单个传参,apply是传数组或伪数组
异同点:2.执行方式不同 call和apply是立刻执行函数,apply不会立即执行,而是返回一个修改this的新函数
/*
1. 函数this指向 : 谁‘调用’我,我就指向谁
1.1 普通函数: 函数名() this -> window
1.2 构造函数: new 函数名() this -> new创建实例
1.3 对象方法: 对象名.方法名() this -> 对象
2. 默认情况下,函数内部的this是固定的,无法动态修改。 如果想要动态修改函数this指向,需要使用函数上下文调用。
* 函数上下文 : 函数作用域
3. 函数上下文调用 : 动态修改this指向
函数名.call(修改的this,参数1,参数2…………)
函数名.apply(修改的this, 数组/伪数组 )
函数名.bind(修改的this)
*/
let fn = function (a, b) {
console.log(this)
console.log(a + b)
}
//(1)函数名.call(修改的this,参数1,参数2…………)
fn.call({name:'张三'},10,20)
//(2)函数名.apply(修改的this, 数组/伪数组 )
// apply底层会自动遍历数组,然后按照顺序逐一传参
fn.apply({name:'李四'},[15,25])
//(3)函数名.bind(修改的this)
// bind不会立即执行函数,而是返回一个修改this之后的新函数
let newFn = fn.bind({name:'王五'})
newFn(8,9)