使用call、apply和bind都能够是函数的上下文发生改变,那我们来具体看看这记者之间的区别吧。
call方法:
语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
apply方法:
语法:apply([thisObj[,argArray]])
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
说明:如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
bind方法:
语法:bind(thisArg[, arg1[, arg2[, ...]]])
定义:将接受多个参数的函数变换成接受一个单一参数。
说明:bind()方法所返回的函数的length(形参数量)等于原函数的形参数量减去传入bind()方法中的实参数量(第一个参数以后的所有参数),因为传入bind中的实参都会绑定到原函数的形参。
哎呀妈呀,讲了那么多理论的东西,我都晕了,还是看看实际的例子:
var test = { a : 5, b : 6, sum : function (a,b) { var self = this; function getA() { return self.a; } function getB(){ return self.b; } alert(a); alert(b); return getA() + getB(); } } var obj = {a:2,b:3}; alert(test.sum.call(obj,4,5)); // 调用时self = this = obj,alert顺序4,5,5 alert(test.sum.apply(obj,[6,7])); // 调用时self = this = obj,alert顺序6,7,5 var sum = test.sum.bind(obj,8); // 此处返回一个只有一个参数的函数sum(b) alert(sum(9)); // 调用时self = this = obj,alert顺序8,9,5
从上面的例子我们可以很清晰的看到call、apply和bind之间的区别。其中call和apply是差不多的,只是传参的形势不同(apply的第二个参数为一个数组或arguments),他们都是直接直接执行函数;
而bind函数将test.sum简化为另一个全局函数sum(b),sum(b)只需要传入一个参数即可。
标签:obj,bind,sum,alert,call,apply From: https://www.cnblogs.com/fly-s/p/18418846