bind、apply与call
bind、apply与call
先说观点:不论是bind、apply还是call,最大的好处就是代码复用。
bind
在开发中,我们只有复用代码时,才会出现this指向需要改动的情况。
纵观bind的常用方法,不论是偏函数还是快捷调用等等,即使是setTimeout,也都是希望能把别的地方的方法拿过来用,才会出现this指向不对的情况。
一言以蔽之:因为是面向对象,才会出现绑定this的需要。
这话并不是空穴来风,面向对象的好处就在于抽象程度高,封装好的一个类,可以在不改变源码的情况下,经过一些操作,拿来即用。这是一个无比方便的地方,相信改过别人代码的同学对此深有体会。
面向对象经过高度的抽象,使得代码复用更加方便,也导致了更多的模块管理相关的问题,这又是一个大课题,就不细讲了。
不论是出于性能还是开发成本的考虑,我们在开发中,经常要用其他对象上的方法。举个例子,把类数组对象转为数组对象:
var transfer = Function.prototype.apply.bind(Array.prototype.slice);
transfer(obj);
bind的其他用法可以参考MDN,我在这里不多写了。
call与apply
call和apply大同小异,唯一不同在于传参,call接受变长参数,apply接受数组或者类数组对象。
具体使用方法,参考MDN,call、apply
同样的,call和apply也是因为想要复用代码,出现了this指向不对的情况,怎么办,给它传this吧,传哪指哪。
举个例子:
var say = {
name: 'Mike',
hi: function () {
console.log('hi ' + this.name)
}
};
function sayHi(name){
this.name = name;
}
say.hi.call(new sayHi('Bob'));
bind与call和apply的区别
bind和call的区别就在于,bind会返回一个新的函数,call和apply都是直接调用原函数,并不会返回一个新函数。
在需要新函数的地方用bind,只是想做一锤子买卖,就用call和apply。
在不清楚多少参数的地方,建议new一个数组,push参数进去,或者大部分情况下,可以传arguments对象,就用apply,否则,就用call。
bind、apply与call的更多相关文章
- javascript中bind,apply,call的相同和不同之处
javasctipt中bind,apply,call的相同点是: 1,都是用来改变this的指向; 2,都可以通过后续参数进行传参; 3,第一个参数都是指定this要指向的对象; 不同点: 1,调用方 ...
- javascript 的bind/apply/call性能
javascript有两种使用频率非常高的三个内置的功能:bind/apply/call.许多技术是基于高点,这些功能实现.这三个功能被用来改变的功能运行环境.从而达到代码复用的目的. 先来所说bin ...
- .bind.apply() 解决 new 操作符不能用与 apply 或 call 同时使用
背景: 小明想要用数组的形式为 Cls.func 传入多个参数,他想到了以下的写法: var a = new Cls.func.apply(null, [1, 2, 3]); 然而浏览器却报错Cls. ...
- bind,apply,call的区别
在Javascript中,bind, apply, call方法都可以显式绑定上下文this,这三者有何不同呢? bind只绑定this不马上执行 var person = { firstname: ...
- 箭头函数表达式和声名式函数表达式的区别以及 Function.prototype的bind, apply,call方法
箭头函数不能用做构造函数 箭头函数没有arguments参数 箭头函数没有自己的this,是从作用域链上取this,是与箭头函数定义的位置有关的,与执行时谁调用无关,所以用call,apply,bin ...
- JavaScript: bind apply call
var foo = function(age,sex){ console.log(this.name,age,sex); }; //call将改变函数运行的context foo.call({name ...
- bind,apply,call区别总结
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- this bind apply call
this 是当前函数运行时所属的对象bind 是指定一个函数运行时的上下文,也就是说把这个函数的this指向绑定到相应对象上,默认的暴露在全局御中的函数this指向widow对象, 严格模式下全局的t ...
- call bind apply的区别
call() 和apply()的第一个参数相同,就是指定的对象.这个对象就是该函数的执行上下文. call()和apply()的区别就在于,两者之间的参数. call()在第一个参数之后的 后续所有参 ...
- 数组去重,call、apply、bind之间的区别,this用法总结
一.数组去重,直接写到Array原型链上. //该方法只能去除相同的数字 不会去判断24和'24'是不同的 所有数字和字符串数字是相同是重复的 Array.prototype.redup=functi ...
随机推荐
- 个人作业3——个人总结(Alpha阶段)。
一:个人总结: 陆续几周以及加上上上一周的Alpha冲刺阶段,完成了实验室故障报修系统的基础框架以及内容.这个过程苦中有乐,或许苦中寻乐更加恰当,以一个小组团队的形式来完成这个项目,我们大家就变成了一 ...
- 201521123076 《JAVA程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容 初步了解了接口的概念,学会使用接口,强化面向对象思想 Comparable,Com ...
- 201521123061 《Java程序设计》第五周学习总结
201521123061 <Java程序设计>第五周学习总结 1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 1.代 ...
- 201521123085 《Java程序设计》 第2周学习总结
1. 本周学习总结 1.学习了string类: 2.java数组的使用: 3.学习了类名包名. 2. 书面作业 Q1.使用Eclipse关联jdk源代码,并查看String对象的源代码(截图) ...
- 看懂类图——UML类图基础
类图 要学懂设计模式,就需要先看得懂类图,类与类之间的关系是学习设计模式的基础,而在软件工程中,类与类之间的关系是通过UML中的类图来体现. 这篇笔记包含的不会是类图的所有东西,包含的只是各个类之间的 ...
- eclipse中svn插件在线安装方式
SVN插件地址:http://subclipse.tigris.org/update_1.8.x 第一步:eclipse>Help菜单>Install New Software- 第二步: ...
- C# 各种常用集合类型的线程安全版本
在C#里面我们常用各种集合,数组,List,Dictionary,Stack等,然而这些集合都是非线程安全的,当多线程同时读写这些集合的时候,有可能造成里面的数据混乱,为此微软从Net4.0开始专门提 ...
- Java-Filter过滤器用于过滤整个项目的编码
整个分为实现类以及在web.xml文件中对编写的filter类进行注册 代码如下 package cn.itcast.itcaststore.web.filter; import java.io.IO ...
- Spring 级联属性
Spring 级联属性是当两个bean 关联时 从一个bean 给 另一个bean 赋值 Application xml 配置如下 <bean id="ZhangSan" ...
- .Net Core2.0 + Nginx + CentOS 部署
准备把项目往Linux上迁移,整个流程跑了一下,也遇到无数个坑...以下为亲测并修改后的完整流程... 安装ZIP yum install -y unzip zip Putty:WINDOWS上传文件 ...