今日技术点-call apply bind区别

介绍

欲想深入call、apply 、bind,必现了解函数及其this

this

this就是日常我们代码中调用函数的主体对象

举个例子:

```javascript

    var obj = {

        foo: function(){

            console.info("this===>",this)

        }

    }

    var bar = obj.foo

    obj.foo()  // f打印出的this 就是obj

    bar()      //  打印出的this 就是window

    // 简单来讲就是谁调用函数this就指向谁

```

那么通常函数的调用方式有那些以及区别和联系呢

* 作为函数调用myFun\(a,b\)

* 作为对象方法调用obj.objFun\(\)

* 作为构造函数调用 let Bar = new Animal\("cat"\)

* 作为函数的方法调用 myFun.call\(content,a,b\)

一般我们会很熟悉前面三中方式,但是最后一种myFun.call\(content,a,b\)才是正常的调用形式\(基础形式\),前面的方式都是在这一种方式上封装好的语法糖;

```

  //myFun(a,b) ---> myFun.call(undefined,a,b);

  //obj.objFun() ---> obj.objFun.call(obj);

  因此this也就是我们上面式子中的content-->call的第一个参数

```

 call apply bind的三者的异同

相同点

* 都能用于改变this的指向问题

* 三者的第一个参数都是this要指向的对象,也就是指定的上下文(content)

* 三者都可以利用后续传入参数

 不同点

* bind的返回值是一个新的函数,加上调用才能被执行

* bing方法会创建一个新函数称为绑定函数

* bind返回对应函数,便于稍后调用;而call和apply都是立即调用

* call是针对于已知,逐步转入参数方便 apply时后续参数是以数组的方式

bind

* bind()方法创建一个新的函数,在bind()被调用时,这个新函数的this被bind的第一个参数指定,其余的参数将作为新函数的参数供调用时使用。

```

var module = {

  x: 42,

  getX: function() {

    console.log('this', this)

    return this.x;

  }

}

var unboundGetX = module.getX;

console.log(module.getX)  // 直接是对函数的引用, this没有指定,this 为 window

console.log(module.getX()) // 使用对象module调用函数,所以this就是module

console.log(unboundGetX()); // The function gets invoked at the global scope

// expected output: undefined

var boundGetX = unboundGetX.bind(module); 

console.log(boundGetX());

// expected output: 42

```

call

* call 的作用无非就是当执行一个方法的时候希望能够使用另一个对象来作为作用域对象而已,简单来说就是当我执行 A 方法的时候,希望通过传入参数的形式将一个对象 B 传进去,用以将 A 方法的作用域对象替换为对象 B

```

  // 定义: 调用一个对象的方法,以另一个对象作为当前对象

  // call的使用方法

  // call修改的方式采用的是代入法

  //父类 Person       

  function Person() {           

    this.sayName = function() {

      return this.name;

    }       

  }       

  //子类 Chinese       

  function Chinese(name) { 

      //借助 call 实现继承           

      Person.call(this);

      this.name = name;

      this.ch = function() {

        alert('我是中国人');         

      }                   

  }       

  //测试       

  var chinese = new Chinese('成龙'); // 调用 父类方法

  console.log(chinese.sayName());  //输出 成龙

```

apply

* apply方法让我们构建一个参数数组给调用函数,它也允许我们选择this的值

* apply接受两个参数,第一个是要绑定给this的值,第二个就是一个参数数组

* 当第一个参数为null、undefined的时候,默认指向window

```

    // apply的方法

    function add(a, b) {

        this.a = a;

        this.b = b;

        this.alert = function () {

            alert(this.a + this.b)

        }

    }

    function test() {

        add.apply(this, [5, 5]) //这里可以理解为 test函数中this等于add函数中的this

    }

    var c = new test()

    c.alert() //10

```

应用场景

日常我们在开发中,也许好多小伙伴不是很习惯或者很少使用,其实他们会有很多的使用小技巧

* 工具类文件中的数据最大值和最小值

```

  let basicTools = {

      arrMaxOrMin:function(type,arr){

          let result = Math[type].apply(null,arr);

          return result;

      }

  }

  console.info("最大值",basicTools.arrMaxOrMin("max",[1,2,3]))  // 输出为3

  console.info("最小值",basicTools.arrMaxOrMin("min",[1,2,3]))  // 输出为1

```

* 简单数据类型的数组追加

```

  let basicTools = {

      arrAppendItem:function(arr1,arr2){

          return arr1.push.apply(arr1,arr2);

      }

  }

```

为了帮助大家让学习变得轻松、高效,给大家免费分享一大批资料,帮助大家在成为全栈工程师,乃至架构师的路上披荆斩棘。在这里给大家推荐一个前端全栈学习交流圈:??947552909.,或者?wx:fxq1221623?欢迎大家进群交流讨论,学习交流,共同进步。

有些人对学习充满激情,但是缺少方向,而在浩瀚的知识海洋中看似无边无际,此时最重要的是要知道哪些技术需要重点掌握,避免做无用功,将有限的精力及状态发挥到最大化。

最后祝福所有遇到瓶颈且不知道怎么办的前端程序员们,祝大家在往后的工作与面试中一切顺利。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,042评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,996评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,674评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,340评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,404评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,749评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,902评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,662评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,110评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,577评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,258评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,848评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,726评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,952评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,271评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,452评论 2 348

推荐阅读更多精彩内容