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, 并且无法被传递任何参数。

2.用法

// 用法
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

1.定义    (在EcmaScript5中扩展了叫bind的方法(IE6,7,8不支持))

语法:function.bind(thisArg[, arg1[, arg2[, ...]]])

定义:调用一个对象的一个方法,以另一个对象替换当前对象。 

说明: 

bind()方法创建一个新的函数,在调用时设置this关键字为提供的值。并在调用新函数时,将给定参数列表作为原函数的参数序列的前若干项。

2.用法

// 用法
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

3.总结

bind 会返回改变上下文this后的函数 (并且传参后 函数不能再传递这个参数

call 会执行 带有 指定上下问this 函数

发表评论

请先登陆