【巷子】:关于Apply、call、bind的详解
2024-10-21 13:15:13
call方法:
语法:call(thisObj,'',''........) 定义:调用一个对象的一个方法,以另一个对象替换当前对象 说明:call方法可以用来代替另一个对象调用一个方法。call方法可将一个函数的对象上下文初始的上下文改变为由thisObj指定的新对象,如果没有提供thisObj参数,那么global对象被用做thisObj
apply方法:
语法:apply(thisObj,['','',''....]) 定义:应用某一个对象的方法,用另一个对象替换当前对象 如果argArray不是一个有效的数组或者不是arguments对象,那么将导致一个TypeError.如果没有提供argArray和thisObj任何一个参数,那么Global对象将用做thisObj,并且无法被传递任何参数
相同之处:
1、都是用来改变函数的this对象的指向
2、第一个参数都是this要指向的对象
3、都可以利用后续参数传参 不同之处:
1、call和apply都是对函数的直接调用,而bind方法返回的仍然是一个函数,因此后面需要加上()来进行调用才可以
案例一:bind与call、apply的区别
var a={
name:'阿姨请别把您闺女介绍给我',
sex:'男',
age:'24',
say:function(){
console.log(this.name+',今年'+this.age+'岁,性别'+this.sex)
}
} var b={
name:'就要把闺女介绍给你',
sex:'女',
age:'18'
}
a.say();//阿姨请别把您闺女介绍给我,今年24岁了,性别男 那么我们想一下如何让b用say的方法显示数据呢? 用call方法:a.say.call(b) 用apply方法:a.say.apply(b) 用bind方法:a.say.bind(b)()
案例二:call与apply的区别
var a={
name:'阿姨请不要把您闺女介绍给我',
sex:'男',
age:'18',
say:function(school,grade){
console.log(this.name+'性别'+this.sex+'年龄'+this.age+school+grade)
}
} var b={
name:'就喜欢把闺女介绍给你',
sex:'女',
age:'18'
} 现在我们看say方法中多了两个参数,我们通过call和apply的参数进行传参 用call方法:a.say.call(b,'清华','三年级') 用apply方法:a.say.apply(b,['清华','六年级']) call后面的参数与say方法中是一一对应的,而apply第二个参数是一个数组 用bind方法:a.say.bind(b,'清华','三年级')
但是由于bind返回的仍然是一个函数,所以我们可以在调用的时候在进行传参
a.say.bind(b)('清华','三年级')
由于IE6-IE8不支持该方法,所以若想在不同浏览器中使用所以我们要做下处理
兼容处理bind方式
if(!Function.prototype.bind){
Function.prototype.bind=function(obj){
var This=this;
var args=arguments;
return function(){
This.apply(obj,Array.prototype.slice.call(args,1))
}
}
}
注:还有一些不完善的部分,还会持续更新。显凑活着看!加油你们都是最棒的。么么哒!!! 另外大神可以指点不足之处
最新文章
- VS2012新建项目出错:未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService
- LVS负载平衡集群(没成型)
- MyEclipse去除网上复制下来的来代码带有的行号
- pthread_mutex_lock
- LR 测试数据库总结
- wikioi 1204 寻找子串位置
- sc7731 Android 5.1 LCD驱动简明笔记之一
- Tornado,了解一下
- windows内核初窥(二)-----系统机制
- ACM2055_ctype.h_cctype
- Android之HandlerThread
- Tomcat使用Memcached Session Manager管理Session
- PuTsangTo-单撸游戏开发03 碰撞与跳跃瑕疵版
- 《android开发艺术探索》读书笔记(二)--IPC机制
- 源码安装Nginx加TCP反向代理模块
- XVIII Open Cup named after E.V. Pankratiev. Ukrainian Grand Prix
- Logstash grok解析IIS 10.0 日志实例
- SuperArray
- 归并排序(C++实现)
- elasticsearch6 学习之并发控制
热门文章
- Photoshop脚本入门
- C++ 类的复制控制
- 正则表达式”\d+\.?\d*”在匹配下列字符串时结果是失败的是?
- 实现QQ第三方登录教程(php)
- port被占用的处理方法
- hbase集群部分节点HRegionServer启动后自动关闭的问题
- oracle 死锁和锁等待的区别
- js简单的弹出框有关闭按钮
- HTML <;a>; 标签的状态和 target 属性
- easyui------设置datagrid(&#39;getEditor&#39;)时焦点问题