简而言之:
bind创建函数,call和apply执行函数,apply需要以数组形式传递参数
详细解释:
假设我们有一个名为multiplication
的函数
function multiplication(a,b){
console.log(a*b);
}
让我们使用bind
创建一些标准函数
var multiby2 = multiplication.bind(this,2);
现在,multiby2(b)
等同于multiplication(2,b)
。
multiby2(3)
multiby2(4)
如果我在绑定时同时传递两个参数会发生什么?
var getSixAlways = multiplication.bind(this,3,2)
现在 getSixAlways() 等于 multiplication(3,2);
getSixAlways()
即使传递参数,也会返回6;
getSixAlways(12); //6
var magicMultiplication = multiplication.bind(this)
这将创建一个新的乘法函数,并将其赋值给magicMultiplication。
哦不,我们将乘法功能隐藏在了magicMultiplication中。
调用magicMultiplication
会返回一个空白的function b()
。
执行时它可以正常工作:magicMultiplication(6,5); //30
那使用call和apply呢?
magicMultiplication.call(this,3,2); //6
magicMultiplication.apply(this,[5,2]); //10
call()
和apply()
都是调用函数的方法,但bind()
是创建一个新的函数。使用call()
时,需要逐个传递参数;而使用apply()
时,则需将参数作为数组传入。如需了解更多细节,请查看相关文档,它们可以完整地回答你的问题。 - Nopebind()
,而另外两个函数则已存在于JavaScript 1.3 - ECMA-262第3版中,例如关于它们的问题,Stack Overflow上有像what-is-the-difference-between-call-and-apply这样的问题。我只是猜测,因为我自己也在思考这个问题。 - Nope