JavaScript中apply、call和bind方法的详解与使用

作者:闭包旅人时间:2026-10-21 22:05:49浏览:202

本文详细解析JavaScript中apply、call和bind三个方法的区别与应用。通过对比参数传递方式,说明apply和call如何立即执行函数并改变this指向,以及bind如何返回新函数以固定this上下文。结合Math.max、数组操作及IE兼容等实例,帮助开发者掌握函数绑定技巧。

apply与call方法的区别

fun.apply(context,[argsArray])

该方法会立即调用fun函数,并将函数内部的this指向替换为传入的context对象,从而实现同一方法在不同对象间的复用。

context参数:传入的对象,用于替代fun函数原有的this值;

argsArray参数:一个数组或类数组对象,其中的元素会被展开并作为独立实参传递给fun函数,需注意参数的顺序。

fun.call(context,[arg1],[arg2],[…])

与apply功能类似,区别在于参数传递方式。call要求将参数逐个传入;若参数数量不确定,则应使用apply。

应用场景:

Math.max()仅接受独立参数,通过以下方式可在数组上应用max方法:


Math.max.apply(null, array);//会将array数组参数展开成单独的参数再传入
Array.prototype.push.apply(arr1,arr2);//将一个数组拆开push到另一个数组中;不用apply则会将后续数组参数当成一个元素push进去。
Array.prototype.slice.call(arguments);//在类素组对象上使用slice方法

bind方法详解

fun.bind(context,[arg1],[arg2],[…])

使fun方法执行时的context永远固定不变。

arg1:传递给新函数的初始参数列表

返回一个新函数供后续调用,其函数体与原函数fun一致,但新函数的this指向新传入的context对象。新函数已预设初始参数,后续调用时的实参需排在后面。


var displayArgs = function (val1, val2, val3, val4) {
 console.log(val1 + " " + val2 + " " + val3 + " " + val4);
}
var emptyObject = {};
// 生成新函数时指定了2个参数
var displayArgs2 = displayArgs.bind(emptyObject, 12, "a");
// 调用时传入另2个参数,往后排
displayArgs2("b", "c");
// Output: 12 a b c

使用bind()方法改写slice()方法:


var _Slice = Array.prototype.slice;
var slice = Function.prototype.call.bind(_Slice);
slice(…); 

IE兼容性处理

bind()兼容IE5~IE8的处理方案


if (!Function.prototype.bind) {
 Function.prototype.bind = function(context) {
  var self = this, // 即调用bind方法的目标函数
  args = arguments;
  return function() {
   self.apply(context, Array.prototype.slice.call(args, 1));
  }
 }
}

this指向与setTimeout

通常情况下,setTimeout()中的this指向window或global对象。当在类的方法中需要this指向类实例时,可使用bind()将this绑定到调用对象。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持本站!

作者最新文章