本文详细解析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绑定到调用对象。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持本站!