大家好,我是热狗得小舔狗!
call,apply,bind的用法以及区别
- 首先
作用: call()、apply()、bind() 是用来改变上下文对象的,就是改变this的指向!
call()用法
举例
let fn = function(a,b){
console.log(this,a,b); //本来this -> fn
}
let obj = {name:"obj"};
fn.call(obj,1,2); // 调用call后
// 此时 this -> obj a->1 b->2
// 打印 {name: 'obj'} 1 2
fn.call(); fn.call(null); fn.call(undefined);
// 非严格模式 此时 this -> window a -> undf b->undf
// 严格模式 此时 this -> 参1(分别: undf, null, undf)
apply()用法
与call()语法相似,只是传参用数组或类数组的形式
fn.call(obj, 1, 2)
fn.apply(obj, [1, 2])
举例
let fn = function(a,b){
console.log(this,a,b); //本来this -> fn
}
let obj = {name:"obj"};
fn.apply(obj, [1, 2]); // 调用apply后
// 此时 this -> obj a->1 b->2
// 打印 {name: 'obj'} 1 2
fn.apply(); fn.apply(null); fn.apply(undefined);
// 非严格模式 此时 this -> window a -> undf b->undf
// 严格模式 此时 this -> 参1(分别: undf, null, undf)
bind()用法
语法上面来讲还是和call()相似,区别在于返回值,bind()返回的是一个新函数
举例
let fn = function(a,b){
console.log(this,a,b); //本来this -> fn
}
let obj = {name:"obj"};
let newfn = fn.bind(obj,1,2); // 调用bind后 返回函数
// 并没有执行
newfn(); // 执行函数 控制台打印
总结
区别:
call()与apply()相似 只是传参方式不同
bind()返回的是一个新函数, 不会立即执行,可以在你需要的时候调用
总之根据自己的需求啦