apply:func.apply(obj,[arg1,arg2,...]) 把函数func内部的this做用域指向obj,而后把传给func的参数分别放到数组中传给func
数组
call:func.call(obj,arg1,arg2,...) 与apply相似,不过传参的方式是一个一个传,不用放在数组里边
app
bind:func.bind(obj,arg1,arg2,...)(other-arg); 与call和apply不一样的是,bind()能够预约义参数,arg1和arg2为预约义的参数,other-arg为其余参数,这么作的好处在于,咱们能够用先用一个变量var vary = func.bind(obj,arg1,arg2,...),而后再使用vary(other-arg)来传入其余参数,如此一来,就至关于给函数预先传入了一些相对不变参数,一些须要变化的参数再另外传入,这是apply和call都作不到的。
bind的用法举例及其效果
函数
// 定义在Function.prototype上,好让使用Function构造器建立新函数的时候都自带bind()方法 Function.prototype.bind=function(obj,arg){ // 获取从第二个参数起也就是除了obj以外的其他参数 var arg=Array.prototype.slice.call(arguments,1); // 把this做用域赋给context,由于关键词this的做用域在不一样的地方不同 var context=this; // 定义一个函数,使之能够拼接原bind函数传入的参数,即bind(obj,args1)(args2) == bind(obj,args1,args2) // 这里默认让newArg为一个对象,否则会报错 var bound=function(newArg={}){ arg=arg.concat(Array.prototype.slice.call(newArg)); return context.apply(obj,arg); } // 接下来就是建立一个新函数,使它的prototype(原型对象)等于Function的prototype,而后再把要return的函数bound的prototype指向F这个构造函数, // 就把bind()方法放到Function.prototype中去了 var F=function(){} F.prototype=context.prototype; bound.prototype=new F(); return bound; }
https://www.jianshu.com/p/423f72d502c2 还不懂原型链的建议看看this