参考了这篇文章:http://www.tuicool.com/articles/EVF3Eb

给几个例子

  1. function add(a,b)
  2. {
  3. alert(a+b);
  4. }
  5. function sub(a,b)
  6. {
  7. alert(a-b);
  8. }
  9. add.call(sub,,);

这个运行是什么呢?答案:

  1. . 运行的是add.
  2.  
  3. 因为call是运行的调用者。将第一个参数作为this参数来使用。

再来一个例子

  1. function Animal(){
  2. this.name = "Animal";
  3. this.showName = function(){
  4. console.log(this.name);
  5. }
  6. }
  7. function Cat(){
  8. this.name = "Cat";
  9. }
  10. var animal = new Animal();
  11. var cat = new Cat();
  12.  
  13. animal.showName.call(cat,",");
  14. 或者
  15. animal.showName.apply(cat,[]);

答案是:

  1. Cat 因为this换做了Cat

另外,继承时候用来调用父类的构造函数:

  1. function Animal(name){
  2. this.name = name;
  3. this.showName = function(){
  4. console.log(this.name);
  5. }
  6. }
  7. function Cat(name){
  8. Animal.call(this, name);
  9. }
  10. var cat = new Cat("Black Cat");
  11. cat.showName();

调用完父类之后,cat也有了showName的方法。

下面这两种调用基本等价:

  1. myfunc.call(func,"var"," fun");
  2. myfunc.apply(func,["var"," fun"]);

而关于bind:作用:改变了上下文的this

bind与call不同点有两个:

①bind的返回值是函数。

//使用bind是 返回改变上下文this后的函数

//使用call是 改变上下文this并执行函数

②后面的参数的使用也有区别

  1. function f(a,b,c){
  2. console.log(a,b,c);
  3. }
  4.  
  5. var f_Extend = f.bind(null,"extend_A")
  6. f("A","B","C") //这里会输出--> A B C
  7.  
  8. f_Extend("A","B","C") //这里会输出--> extend_A A B
  9.  
  10. f_Extend("B","C") //这里会输出--> extend_A B C
  11.  
  12. f.call(null,"extend_A") //这里会输出--> extend_A undefined undefined
  13.  
  14. call 把第二个及以后的参数作为f方法的实参传进去
  15.  
  16. bind 虽说也是获取第二个及以后的参数用于之后方法的执行,但是f_Extend中传入的实参则是在bind中传入参数的基础上往后排的。

所以,以下两个是等价的:

  1. var f_Extend = f.bind(null,"extend_A")
  2.  
  3. //↓↓↓
  4.  
  5. var f_Extend = function(b,c){
  6. return f.call(null,"extend_A",b,c);
  7. }

有一个应用场景:

  1. 例如现在有一个方法 根据不同的文件类型进行相应的处理,通过bind 就可以创建出简化版的处理方法
  2.  
  3. function FileDealFunc(type,url,callback){
  4. if(type=="txt"){...}
  5. else if(type=="xml"){...}
  6. .....
  7. }
  8.  
  9. var TxtDealFunc = FileDealFunc.bind(this,"txt");
  10. //这样使用的时候更方便一些
  11.  
  12. FileDealFunc("txt",XXURL,func); //原来
  13.  
  14. TxtDealFunc(XXURL,func); //现在

对于旧的版本,可以用以下方式做兼容处理(EcmaScript5中扩展了叫bind的方法(IE6,7,8不支持))

  1. if (!Function.prototype.bind) {
  2. Function.prototype.bind = function(obj) {
  3. var _self = this
  4. ,args = arguments;
  5. return function() {
  6. _self.apply(obj, Array.prototype.slice.call(args, ));
  7. }
  8. }
  9. }

不过上面的函数,好像只接受了一个参数。

JS里面的call, apply以及bind的更多相关文章

  1. js里function的apply vs. bind vs. call

    js里除了直接调用obj.func()之外,还提供了另外3种调用方式:apply.bind.call,都在function的原型里.这3种方法的异同在stackoverflow的这个答案里说的最清楚, ...

  2. JS中call、apply、bind使用指南,带部分原理。

    为什么需要这些?主要是因为this,来看看this干的好事. box.onclick = function(){ function fn(){ alert(this); } fn();}; 我们原本以 ...

  3. js中call、apply、bind那些事

    前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如- 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...

  4. js中call、apply、bind那些事2

    前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如… 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...

  5. JS中call()和apply()以及bind()的区别

    一.方法定义: apply:调用一个对象的一个方法,用另一个对象替换当前对象.例如:B.apply(A, arguments);即A对象应用B对象的方法. call:调用一个对象的一个方法,用另一个对 ...

  6. JS中call()、apply()、bind()的用法

    其实是一个很简单的东西,认真看十分钟就从一脸懵B 到完全 理解! 先看明白下面: 例1 obj.objAge;  //17 obj.myFun()  //小张年龄undefined 例2 shows( ...

  7. 深入理解js里面的this

    闲聊两句(可以忽略): 毕业有半年了,时间还过得真快,不过还好,感觉自己相对于刚毕业那会确实成长了很多:好久没有打游戏了(自己决心要戒掉的),消磨时光的时候就看看电影或者追追电视剧,再无聊就洗洗衣服. ...

  8. js中call、apply和bind到底有什么区别?

    介绍 在js中,每个函数的原型都指向Function.prototype对象(js基于原型链的继承).因此,每个函数都会有apply,call,和bind方法,这些方法继承于Function. 它们的 ...

  9. js里面的Object基本

    属性名必须是字符串,非字符串对象不能用来作为一个对象属性的键,任何非字符串对象,包括number,可通过toString()方法,类型转换成一个字符串1 1,Object基本格式 <script ...

随机推荐

  1. 引用&符号详解

    变量的引用 PHP 的引用允许你用两个变量来指向同一个内容. 例一: <?php $a="2010"; $b =&$a; echo $a;//这里输出:2010 ec ...

  2. Django one

    WEB-Django: Http协议: http协议:超文本传输协议,基于TCP/IP通信协议来传递数据 特点: 1.灵活:允许传输任意类型的数据对象.正在传输的类型有Content-Type标记 2 ...

  3. Spring-Boot自定义Starter实践

    此文已由作者王慎为授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. disconf-spring-boot-starter 使用方法: 引入maven依赖: <depen ...

  4. Jmeter生成8位不重复的随机数

    jmeter的time函数${__time(,)}  :  默认该公式精确到毫秒级别, 13位数 ${__time(/1000,)}  : 该公式精确到秒级别, 10位数 ${__time(yyyy- ...

  5. Leetcode 452.用最少数量的箭引爆气球

    用最少数量的箭引爆气球 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了.开始坐 ...

  6. TOJ 4493 Remove Digits 贪心

    4493: Remove Digits Description Given an N-digit number, you should remove K digits and make the new ...

  7. EOJ Monthly 2018.3

    985月赛我只喜欢ECNU.jpg A. 打工时不可能打工的 Time limit per test: 2.0 seconds Memory limit: 256 megabytes 我 Ayano ...

  8. javascript学习笔记 - 引用类型 单体内置对象

    七 单体内置对象 1.Global对象 不属于任何对象的属性和方法,都归于它.全局作用域中定义的变量.函数,都属于Global对象 1.1 URI编码  encodeURI <=>deco ...

  9. iis上的反向代理

    阅读文章: IIS上的反向代理 ARR(Application Request Routing)

  10. 九度oj 题目1177:查找

    题目描述: 读入一组字符串(待操作的),再读入一个int n记录记下来有几条命令,总共有2中命令:1.翻转  从下标为i的字符开始到i+len-1之间的字符串倒序:2.替换  命中如果第一位为1,用命 ...