call(),apply()和bind()的详解使用:
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()的详解使用:相关推荐
- JS中的call、apply、bind方法详解
bind 是返回对应函数,便于稍后调用:apply .call 则是立即调用 . apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(co ...
- call、apply、bind函数详解
我们都知道call,apply,bind函数都是为了改变this的指向,那么对于三种函数有什么相同点有什么不太点或者有什么应用呢?下面我们来进行介绍 call与apply函数 在javascrip ...
- bind() c语言,c/c++ 标准库 bind 函数详解
bind函数定义在头文件 functional 中.可以将 bind 函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来"适应"原对象的参数列表. bin ...
- BIND配置文件详解(二)
本文档摘录自<BIND9管理员手册>,如果有不对或者不清楚的地方,请大家告诉我,谢谢! BIND配置文件详解(二) 6.options语句 options语句的定义和使用: opt ...
- BIND配置文件详解(三)
本文档摘录自<BIND9管理员手册>,如果有不对或者不清楚的地方,请大家告诉我,谢谢! BIND配置文件详解(三) 7.server语句 服务器(server)语句的定义和使用: ...
- c语言中bind函数,c/c++ 标准库 bind 函数详解
bind函数定义在头文件 functional 中.可以将 bind 函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来"适应"原对象的参数列表. bin ...
- JavaScript 中 apply 、call 的详解
apply 和 call 的区别 ECMAScript 规范给所有函数都定义了 call 与 apply 两个方法,它们的应用非常广泛,它们的作用也是一模一样,只是传参的形式有区别而已. 原文作者:林 ...
- 【bind()函数】JavaScript手写bind()及详解-超详细~~~
这两天学习了手写call.apply.bind,手写bind思考了很久才实现了MDN的示例的结果,所以记录下来~ 因为是第一篇文章,所以可能存在一些错误,希望各位大佬批评指正,不吝赐教. 也欢迎不懂的 ...
- 《Javascript高级程序设计》读书笔记之bind函数详解
为什么需要bind var name = "The Window"; var object = {name: "My Object",getNameFunc: ...
最新文章
- 吴教主深度学习和神经网络课程总纲
- oracle查询grant信息,Oracle学习笔记(四)
- java web 润乾报表教程_润乾报表开发 基础教程.ppt
- 单元测试:unittest.TestCase
- VMware环境下如何使用iSCSI共享存储(配置实验笔记)
- Atitit Seed-Filling种子填充算法attilax总结
- Linux开源字体——“文泉驿正黑”的安装命令
- java对redis的基本操作 - edisonfeng
- 梦幻西游跑商脚本教程
- 利用电脑学象棋的一点想法
- 数据库+PullToRefreshListView
- 富途牛牛A股数据API使用基础教程
- 俄罗斯方块解析全过程
- 使用Zeppelin时出现sh interpreter not found错误的解决办法(图文详解)
- AWD平台搭建--Cardinal
- 原创:编写jquery 选项卡插件
- 编译tensorflow1.15.4,使其支持AVX2 和 FMA
- Apache NiFi系统管理员指南 [ 四 ]
- P1508 Likecloud-吃、吃、吃(C++_dp)
- 【每日新闻】中国供应商:苹果新iPhone能为其它设备无线充电
热门文章
- 2.1 操作系统的类型与结构
- PPPoE***2:PADR耗竭sessionid
- php phar 无法创建,php composer.phar install 安装问题
- vaspkit使用_VASPKIT校正气体分子自由能
- 4.3.8 DHCP协议
- linux java 替换jre_Linux系统 无需JRE配置Java
- 文字转语音,语音转语音,实际的转化过程
- 为什么三层交换机无法替代路由器?
- SQLServer之修改FOREIGN KEY约束
- 区块链应用 | 用区块链颠覆视频直播,与视频卡顿、缓冲说再见!