JS里面的call, apply以及bind
参考了这篇文章:http://www.tuicool.com/articles/EVF3Eb
给几个例子
- function add(a,b)
- {
- alert(a+b);
- }
- function sub(a,b)
- {
- alert(a-b);
- }
- add.call(sub,,);
这个运行是什么呢?答案:
- . 运行的是add.
- 因为call是运行的调用者。将第一个参数作为this参数来使用。
再来一个例子
- function Animal(){
- this.name = "Animal";
- this.showName = function(){
- console.log(this.name);
- }
- }
- function Cat(){
- this.name = "Cat";
- }
- var animal = new Animal();
- var cat = new Cat();
- animal.showName.call(cat,",");
- 或者
- animal.showName.apply(cat,[]);
答案是:
- Cat。 因为this换做了Cat。
另外,继承时候用来调用父类的构造函数:
- function Animal(name){
- this.name = name;
- this.showName = function(){
- console.log(this.name);
- }
- }
- function Cat(name){
- Animal.call(this, name);
- }
- var cat = new Cat("Black Cat");
- cat.showName();
调用完父类之后,cat也有了showName的方法。
下面这两种调用基本等价:
- myfunc.call(func,"var"," fun");
- myfunc.apply(func,["var"," fun"]);
而关于bind:作用:改变了上下文的this
bind与call不同点有两个:
①bind的返回值是函数。
//使用bind是 返回改变上下文this后的函数
//使用call是 改变上下文this并执行函数
②后面的参数的使用也有区别
- function f(a,b,c){
- console.log(a,b,c);
- }
- var f_Extend = f.bind(null,"extend_A")
- f("A","B","C") //这里会输出--> A B C
- f_Extend("A","B","C") //这里会输出--> extend_A A B
- f_Extend("B","C") //这里会输出--> extend_A B C
- f.call(null,"extend_A") //这里会输出--> extend_A undefined undefined
- call 是 把第二个及以后的参数作为f方法的实参传进去
- 而bind 虽说也是获取第二个及以后的参数用于之后方法的执行,但是f_Extend中传入的实参则是在bind中传入参数的基础上往后排的。
所以,以下两个是等价的:
- var f_Extend = f.bind(null,"extend_A")
- //↓↓↓
- var f_Extend = function(b,c){
- return f.call(null,"extend_A",b,c);
- }
有一个应用场景:
- 例如现在有一个方法 根据不同的文件类型进行相应的处理,通过bind 就可以创建出简化版的处理方法
- function FileDealFunc(type,url,callback){
- if(type=="txt"){...}
- else if(type=="xml"){...}
- .....
- }
- var TxtDealFunc = FileDealFunc.bind(this,"txt");
- //这样使用的时候更方便一些
- FileDealFunc("txt",XXURL,func); //原来
- TxtDealFunc(XXURL,func); //现在
对于旧的版本,可以用以下方式做兼容处理(EcmaScript5中扩展了叫bind的方法(IE6,7,8不支持))
- if (!Function.prototype.bind) {
- Function.prototype.bind = function(obj) {
- var _self = this
- ,args = arguments;
- return function() {
- _self.apply(obj, Array.prototype.slice.call(args, ));
- }
- }
- }
不过上面的函数,好像只接受了一个参数。
JS里面的call, apply以及bind的更多相关文章
- js里function的apply vs. bind vs. call
js里除了直接调用obj.func()之外,还提供了另外3种调用方式:apply.bind.call,都在function的原型里.这3种方法的异同在stackoverflow的这个答案里说的最清楚, ...
- JS中call、apply、bind使用指南,带部分原理。
为什么需要这些?主要是因为this,来看看this干的好事. box.onclick = function(){ function fn(){ alert(this); } fn();}; 我们原本以 ...
- js中call、apply、bind那些事
前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如- 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...
- js中call、apply、bind那些事2
前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如… 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...
- JS中call()和apply()以及bind()的区别
一.方法定义: apply:调用一个对象的一个方法,用另一个对象替换当前对象.例如:B.apply(A, arguments);即A对象应用B对象的方法. call:调用一个对象的一个方法,用另一个对 ...
- JS中call()、apply()、bind()的用法
其实是一个很简单的东西,认真看十分钟就从一脸懵B 到完全 理解! 先看明白下面: 例1 obj.objAge; //17 obj.myFun() //小张年龄undefined 例2 shows( ...
- 深入理解js里面的this
闲聊两句(可以忽略): 毕业有半年了,时间还过得真快,不过还好,感觉自己相对于刚毕业那会确实成长了很多:好久没有打游戏了(自己决心要戒掉的),消磨时光的时候就看看电影或者追追电视剧,再无聊就洗洗衣服. ...
- js中call、apply和bind到底有什么区别?
介绍 在js中,每个函数的原型都指向Function.prototype对象(js基于原型链的继承).因此,每个函数都会有apply,call,和bind方法,这些方法继承于Function. 它们的 ...
- js里面的Object基本
属性名必须是字符串,非字符串对象不能用来作为一个对象属性的键,任何非字符串对象,包括number,可通过toString()方法,类型转换成一个字符串1 1,Object基本格式 <script ...
随机推荐
- 引用&符号详解
变量的引用 PHP 的引用允许你用两个变量来指向同一个内容. 例一: <?php $a="2010"; $b =&$a; echo $a;//这里输出:2010 ec ...
- Django one
WEB-Django: Http协议: http协议:超文本传输协议,基于TCP/IP通信协议来传递数据 特点: 1.灵活:允许传输任意类型的数据对象.正在传输的类型有Content-Type标记 2 ...
- Spring-Boot自定义Starter实践
此文已由作者王慎为授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. disconf-spring-boot-starter 使用方法: 引入maven依赖: <depen ...
- Jmeter生成8位不重复的随机数
jmeter的time函数${__time(,)} : 默认该公式精确到毫秒级别, 13位数 ${__time(/1000,)} : 该公式精确到秒级别, 10位数 ${__time(yyyy- ...
- Leetcode 452.用最少数量的箭引爆气球
用最少数量的箭引爆气球 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了.开始坐 ...
- TOJ 4493 Remove Digits 贪心
4493: Remove Digits Description Given an N-digit number, you should remove K digits and make the new ...
- EOJ Monthly 2018.3
985月赛我只喜欢ECNU.jpg A. 打工时不可能打工的 Time limit per test: 2.0 seconds Memory limit: 256 megabytes 我 Ayano ...
- javascript学习笔记 - 引用类型 单体内置对象
七 单体内置对象 1.Global对象 不属于任何对象的属性和方法,都归于它.全局作用域中定义的变量.函数,都属于Global对象 1.1 URI编码 encodeURI <=>deco ...
- iis上的反向代理
阅读文章: IIS上的反向代理 ARR(Application Request Routing)
- 九度oj 题目1177:查找
题目描述: 读入一组字符串(待操作的),再读入一个int n记录记下来有几条命令,总共有2中命令:1.翻转 从下标为i的字符开始到i+len-1之间的字符串倒序:2.替换 命中如果第一位为1,用命 ...