obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);
两者作用一致,都是把obj(即this)绑定到thisObj,这时候thisObj具备了obj的属性和方法。或者说thisObj『继承』了obj的属性和方法。绑定后会立即执行函数。
两者的不同之处:传递参数不同,call已正常参数传递,apply传参数的形式是以数组的形式传递。
bind():把obj绑定到thisObj,这时候thisObj具备了obj的属性和方法。与call和apply不同的是,bind绑定后不会立即执行。obj.bind(thisObj, arg1, arg2, ...);bind()只是起到绑定作用并不执行,只有执行才会触发obj.bind(thisObj, arg1, arg2, ...)();

     function add(a,b) {this.num1 = a;this.num2 = b;return num1 + num2;}function sub(a,b) {this.num1 = a;this.num2 = b;return num1 - num2;}console.log( add(3,5) );//8console.log( sub(5,3) );//2console.log( sub.call(add,5,3) );//把sub()的方法绑定到add()方法上。实现了sub()方法。console.log( sub.apply(add,[5,3]) );//2console.log( add.call(sub,5,3) );//8console.log( add.apply(sub,[5,3]) );//8

在对象中的使用:

     var person = {sex: "boy",action: function() {console.log( this.sex+"  good good study,day day up!" );//return this.sex+"  good good study,day day up!";
         }}console.log(person.action);//f() {}var p1 = person.action;p1();//undefined  good good study,day day up!p1.call(person);//boy good good study,day day up!p1.apply(person);//boy good good study,day day up!//使用call(),apply();被调用的对象的方法能够访问对象的属性,赋给调用者。同样可以传递参数。var person1 = {sex: "boy",action: function(a,b) {console.log( this.sex+"  good good study,day day up!"+"age: "+a+"job: "+b );//return this.sex+"  good good study,day day up!";
         }}console.log(person1.action);//f() {}var p1 = person1.action;p1(23,"IT");//undefined  good good study,day day up!age: 23job: ITp1.call(person1,23,"IT");//boy good good study,day day up!age: 23job: ITp1.apply(person1,[23,"IT"]);//boy good good study,day day up!age: 23job: IT

利用call()或者apply()方法可对对象等使用其他数据类型的方法;(可以理解为把谁的方法添加到调用的对象上)

    var a = {a: 1,b: "assassin",c: 2}//console.log(a.slice());//TypeError a.slice is not a functionconsole.log( Array.prototype.slice.call(a) );//[]

可以扩展到自己的方法中:

    var animate = {name: "animate",fnAn: function() {console.log("animate...");}}var pp = {};animate.fnAn.call(pp);//speak...animate.fnAn.call(pp);//speaking

通过call和apply,我们可以实现对象继承。

    function People() {this.age = 23;this.name = "assassin";}var people = {};console.log( People);//ƒ People() {//...}console.log( people );//{}//People.call(people);
    People.apply(people);console.log(people);//{age: 23, name: "assassin"}//同样可以传递参数:function People1(age,name) {this.age = age;this.name = name;}var people1 = {};console.log( People1);//ƒ People(age,name) {//...}console.log( people1 );//{}//People.call(people,23,"assassin");People1.apply(people1,[23,"assassin"]);console.log(people1);//{age: 23, name: "assassin"}

bind();方法使用详解

    function fn1(a,b) {console.log( a*b );}function fn2(a,b) {console.log( a/b );
    }fn1(6,3);//18fn1.bind(fn2,6,3);//并没有执行fn1.bind(fn2,6,3)();//18

转载于:https://www.cnblogs.com/intelwisd/p/7993208.html

call(),apply()和bind()的详解使用:相关推荐

  1. JS中的call、apply、bind方法详解

    bind 是返回对应函数,便于稍后调用:apply .call 则是立即调用 . apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(co ...

  2. call、apply、bind函数详解

     我们都知道call,apply,bind函数都是为了改变this的指向,那么对于三种函数有什么相同点有什么不太点或者有什么应用呢?下面我们来进行介绍 call与apply函数  在javascrip ...

  3. bind() c语言,c/c++ 标准库 bind 函数详解

    bind函数定义在头文件 functional 中.可以将 bind 函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来"适应"原对象的参数列表. bin ...

  4. BIND配置文件详解(二)

    本文档摘录自<BIND9管理员手册>,如果有不对或者不清楚的地方,请大家告诉我,谢谢!   BIND配置文件详解(二)   6.options语句 options语句的定义和使用: opt ...

  5. BIND配置文件详解(三)

    本文档摘录自<BIND9管理员手册>,如果有不对或者不清楚的地方,请大家告诉我,谢谢!   BIND配置文件详解(三)   7.server语句 服务器(server)语句的定义和使用: ...

  6. c语言中bind函数,c/c++ 标准库 bind 函数详解

    bind函数定义在头文件 functional 中.可以将 bind 函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来"适应"原对象的参数列表. bin ...

  7. JavaScript 中 apply 、call 的详解

    apply 和 call 的区别 ECMAScript 规范给所有函数都定义了 call 与 apply 两个方法,它们的应用非常广泛,它们的作用也是一模一样,只是传参的形式有区别而已. 原文作者:林 ...

  8. 【bind()函数】JavaScript手写bind()及详解-超详细~~~

    这两天学习了手写call.apply.bind,手写bind思考了很久才实现了MDN的示例的结果,所以记录下来~ 因为是第一篇文章,所以可能存在一些错误,希望各位大佬批评指正,不吝赐教. 也欢迎不懂的 ...

  9. 《Javascript高级程序设计》读书笔记之bind函数详解

    为什么需要bind var name = "The Window"; var object = {name: "My Object",getNameFunc: ...

最新文章

  1. 吴教主深度学习和神经网络课程总纲
  2. oracle查询grant信息,Oracle学习笔记(四)
  3. java web 润乾报表教程_润乾报表开发 基础教程.ppt
  4. 单元测试:unittest.TestCase
  5. VMware环境下如何使用iSCSI共享存储(配置实验笔记)
  6. Atitit Seed-Filling种子填充算法attilax总结
  7. Linux开源字体——“文泉驿正黑”的安装命令
  8. java对redis的基本操作 - edisonfeng
  9. 梦幻西游跑商脚本教程
  10. 利用电脑学象棋的一点想法
  11. 数据库+PullToRefreshListView
  12. 富途牛牛A股数据API使用基础教程
  13. 俄罗斯方块解析全过程
  14. 使用Zeppelin时出现sh interpreter not found错误的解决办法(图文详解)
  15. AWD平台搭建--Cardinal
  16. 原创:编写jquery 选项卡插件
  17. 编译tensorflow1.15.4,使其支持AVX2 和 FMA
  18. Apache NiFi系统管理员指南 [ 四 ]
  19. P1508 Likecloud-吃、吃、吃(C++_dp)
  20. 【每日新闻】中国供应商:苹果新iPhone能为其它设备无线充电

热门文章

  1. 2.1 操作系统的类型与结构
  2. PPPoE***2:PADR耗竭sessionid
  3. php phar 无法创建,php composer.phar install 安装问题
  4. vaspkit使用_VASPKIT校正气体分子自由能
  5. 4.3.8 DHCP协议
  6. linux java 替换jre_Linux系统 无需JRE配置Java
  7. 文字转语音,语音转语音,实际的转化过程
  8. 为什么三层交换机无法替代路由器?
  9. SQLServer之修改FOREIGN KEY约束
  10. 区块链应用 | 用区块链颠覆视频直播,与视频卡顿、缓冲说再见!