js 中 call apply bind
call 和 apply
1.方法定义
call方法:
-
语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
- 定义:调用一个对象的一个方法,以另一个对象替换当前对象。
-
说明:
- call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
apply方法:
-
语法:apply([thisObj[,argArray]])
- 定义:应用某一对象的一个方法,用另一个对象替换当前对象。
-
说明:
- 如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
-
用法
// 用法
const obj = {a:1};
function fn1(a,b,c){
console.log(this, a, b, c)
}
fn1.call(obj,2,3,4); // 结果:{a: 1} 2 3 4
fn1.apply(obj,[2,3,4]); // 结果:{a: 1} 2 3 4
fn1(1,2,3); // 结果:Window{} 1 2 3
- 3.总结
call 和 apply 都会改变 函数执行时的this指向
call 只能一个参数一个参数传递 而 apply 可以用数组方式传递多个参数类似解构
bind
-
定义 (在EcmaScript5中扩展了叫bind的方法(IE6,7,8不支持))
-
语法:function.bind(thisArg[, arg1[, arg2[, …]]])
-
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
-
说明:
- bind()方法创建一个新的函数,在调用时设置this关键字为提供的值。并在调用新函数时,将给定参数列表作为原函数的参数序列的前若干项。
-
用法
// 用法
const obj = {a:1};
function fn1(a,b,c){
console.log(this, a, b, c);
}
fn1.bind(obj,2,3,4); // 返回 fn1(a,b,c){console.log(this, a, b, c)} ???
fn1.bind(obj,2,3,4)(4,4,4); // 返回 {a: 1} 2 3 4 不能传递相同的参数
fn1(1,2,3); // 结果:Window{} 1 2 3
- 总结
bind 会返回改变上下文this后的函数 (并且传参后 函数不能再传递这个参数)
call 会执行 带有 指定上下问this 函数