js中的call(),apply(),bind()用法以及区别

最近在总结项目中遇到过的问题,一直不太清楚 call(), apply(), bind()这三者的区别,在此做下记录。
eg1:
var name="老王",age="38"
var obj={
var name:'小王',
var newAge:this.age,
function(){
console.log(this.name+”年龄”+this.age)
  }
}
obj.objAge;  // 17
obj.myFun()  // 小王年龄 undefined

eg2:
var name2="大王"
function shows(){
console.log(this.name2)
}
shows()  // 大王 
比较下这两者 this 的差别,第一个打印里面的 this 指向 obj,第二个全局声明的 shows() 函数 this 是 window ;

js中的 apply(),call() 和 bind() 都是Function.prototype下的方法,因此所有 Function 的实例对象(也就是函数)都可以使用这三个方法,
  这三个方法都是用于改变函数运行时上下文对象,换句话说 三者的相同点:都是用来改变重定义this指向的
1. call()
语法:function.apply( thisObj,string1,string2 )
call() 接收多个参数:第一个是新的 this 对象,从第二个开始都是函数需要传递的参数,参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,如果函数调用不需要参数的话,
则可以省略,当第一个参数为null、undefined的时候,默认指向window。

2.apply()
语法:function.apply( thisObj,[string1,string2] )
apply() 只能传入两个参数,第一个是新的 this 对象,第二个参数都必须放在一个数组里面传进去。

3.bind()
传参语法和call()相同,但call()改过this的指向后,会再执行函数,bind()改过this后,不执行函数,
会返回一个新的函数,必须调用它才会被执行

以上三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等!
//例如: 
function fn1(){
  console.log("我被调用了");
  console.log(this) //指向this 
}
var obj = {}; 
fn1.call(obj) //直接调用函数 
var newFun = fn1.bind(obj); //bind()不能调用函数 
newFun(); //此时才调用函数
或者 fn1.bind(obj)();
eg1无参数:
obj.myFun.call(db);    // 德玛年龄 99
obj.myFun.apply(db);    // 德玛年龄 99
obj.myFun.bind(db)();   // 德玛年龄 99

eg2有参数:
obj.myFun.call(db,'成都','上海');     // 德玛 年龄 99  来自 成都去往上海
obj.myFun.apply(db,['成都','上海']);      // 德玛 年龄 99  来自 成都去往上海  
obj.myFun.bind(db,'成都','上海')();       // 德玛 年龄 99  来自 成都去往上海
obj.myFun.bind(db,['成都','上海'])();   // 德玛 年龄 99  来自 成都, 上海去往 undefined

参考链接:runoob.com/w3cnote/js-call-apply-bind.html

posted @ 2020-07-02 16:24  涵三点  阅读(344)  评论(0编辑  收藏  举报